sql - 计算postgres中每组至少出现k次的唯一值的数量
问题描述
我有一个包含 3 列的表,如下所示:
ID | obs_type | Value
1 A 0.1
1 A 0.2
1 B 0.4
2 B 0.5
2 C 0.2
2 C 0.3
3 B 0.1
我想计算每个组类型中至少有 k 个观察值的 ID 数。
在上面的示例中,如果 k = 2(至少要计算相同 ID 的 2 个观察值),我希望:
obs_type | count
A 1
B 0
C 1
因为有一个 ID 有两个 A 型观察值,一个 ID 有两个 C 型观察值。
没有两个 B 型观察的 ID。
对于 k = 1,我只是这样做:
SELECT obs_type, COUNT(DISTINCT ID ) FROM table_x GROUP BY obs_type;
但我正在寻找一种适用于任意 k 的解决方案。
谢谢 !!!!
解决方案
分两步进行聚合:
k = 2 这里:
select count(case when cnt >= 2 then cnt end), obs_type
from
(
select count(*) cnt, obs_type
from table_x
group by id, obs_type
) dt
group by obs_type
派生表(子查询)返回:
cnt obs_type
================ ========
2 A
1 B
1 B
2 C
1 B
然后使用case
表达式进行条件聚合,你会得到:
SQL>select count(case when cnt >= 2 then cnt end), obs_type
SQL&from
SQL&(
SQL& select count(*) cnt, obs_type
SQL& from table_x
SQL& group by id, obs_type
SQL&) dt
SQL&group by obs_type;
obs_type
==================== ========
1 A
0 B
1 C
3 rows found
推荐阅读
- java - 如何使用 JSch 库将 PEM 文件转换为 ssh 到 ec2 的字符串
- list - 如何提取数据以在 Prolog 中列出?
- apache-spark-sql - Datastax 6 独立分析服务器
- python - 加速在 Python 中输出具有重复的产品的函数
- mysql - mysql2 捆绑安装失败
- elixir - 检查用户是否在 Phoenix 模板中进行了身份验证
- asp.net-core - 在 aspnetcore v2.1.1 上找不到 services.AddMvc()
- javascript - Typescript Async 方法是否返回承诺?
- nginx - 将实际目标路径从 nginx 模块发送到后端
- java - Java MethodHandle api 似乎产生了不正确的类型