sql - 如何根据计数过滤数据而不击中子表/子查询两次?
问题描述
我有以下数据,我想通过在 cd 列上应用计数来过滤掉这些数据(即获取所有列,例如 count(cd) > 3)
数据样本(子查询导出)
cd c1 c2 d1
----------------
aa 23 681 4850
aa 23 942 4850
aa 28 944 4881
aa 28 221 4850
bb 46 443 9082
cc 77 171 2831
cc 77 272 2831
dd 18 798 5993
xx 71 166 8755
xx 71 482 3818
xx 71 565 7598
xx 71 603 7246
xx 71 649 4293
xx 71 681 7321
xx 71 250 7453
xx 22 276 3818
xx 22 107 8755
yy 28 143 5802
zz 33 624 3205
zz 33 767 1532
zz 33 372 3205
zz 33 679 3838
我正在使用以下查询,但我不想点击 test_data,因为 hive 表中的数据量很大。(注意:这里的 test_data 是从同一查询中的其他子查询派生的)
SELECT cd, c1, c2, d1
FROM test_data
WHERE cd IN (SELECT cd FROM test_data group by cd having count(cd) > 3)
解决方案
您可以使用窗口函数来获取每个cd
组的计数,但实际上并不聚合,然后过滤掉计数低于 4 的行。虽然这仍然需要一个子查询,但您没有加入任何表,因此它应该更高效.
SELECT
cd,
c1,
c2,
d1
FROM (
SELECT
cd,
c1,
c2,
d1,
count(1) OVER (PARTITION BY cd ORDER BY c1 DESC) as cd_count
FROM test_data
) test_data_1
WHERE cd_count > 3;
推荐阅读
- java - Android 百分比栏 onclicklistener
- python - Python 的内置 type.__init__(name,bases,dct) 有什么作用吗?
- reactjs - 如何使用 CRA 在 package.json 的“代理”中添加对象?
- angular - 我的 Angular 7 组件已连接到数据源,但没有显示数据
- python-2.7 - 在 python 的 mtcnn 中未定义名称“MTCNN”
- facebook - 如何构建一个 facebook 网络爬虫?
- laravel - 如何将文件项目中的任何更改上传到服务器?
- output - pyomo pprint 仅将模型的变量打印到文件中
- django - 我没有得到特定月份的所有记录
- java - 连接子数组中的多条记录