我有以下数据,我想通过对cd列应用counts来过滤掉这些数据(即获取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\数据,因为配置单元表中的数据量很大(注意:这里测试数据来自同一查询中的其他子查询)
SELECT cd, c1, c2, d1
FROM test_data
WHERE cd IN (SELECT cd FROM test_data group by cd having count(cd) > 3)
2条答案
按热度按时间ulydmbyx1#
您可以使用window函数来获取每个
cd
分组但不实际聚合,然后筛选出计数小于4的行。尽管这仍然需要一个子查询,但您没有加入任何表,因此它的性能应该更好一些。kmbjn2e32#
使用窗口函数获取cd的计数,然后使用where子句过滤数据,如下面的查询中所示
选择*from(选择cd,c1,c2,d1,count(cd)over(按cd分区)as cnt from test\ u data)a,其中cnt>3