Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于计数过滤数据,而不必两次点击子表/子查询?_Sql_Apache Spark_Hive_Hiveql - Fatal编程技术网

Sql 如何基于计数过滤数据,而不必两次点击子表/子查询?

Sql 如何基于计数过滤数据,而不必两次点击子表/子查询?,sql,apache-spark,hive,hiveql,Sql,Apache Spark,Hive,Hiveql,我有以下数据,我想通过对cd列应用计数来过滤掉这些数据,即获取所有列,使countcd>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

我有以下数据,我想通过对cd列应用计数来过滤掉这些数据,即获取所有列,使countcd>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_数据,因为配置单元表中的数据量很大。注意:这里的test_数据来自同一查询中的其他子查询

SELECT cd, c1, c2, d1 
FROM test_data
WHERE cd IN (SELECT cd FROM test_data group by cd having count(cd) > 3)

您可以使用window函数获取每个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;

使用窗口函数获取cd的计数,然后使用where子句过滤数据,如下面的查询中所示


选择*从测试数据a中选择cd,c1,c2,d1,countcd作为cnt按cd分区,其中cnt>3

感谢您的回答,但我希望cd>3,它将丢失前两条记录