如何在BigQuery中筛选出数据行数≥15的ID的全部行
筛选BigQuery中拥有至少15条记录的Id的所有行
你遇到的问题核心是不需要聚合数据,只需要过滤出符合记录数要求的Id对应的所有原始行,原SQL报错是因为GROUP BY Id后,SELECT中的date和TotalMinutesAsleep既不在GROUP BY里也没有聚合函数,不符合SQL语法规范。下面提供两种可行方案:
方案一:使用窗口函数(推荐)
通过窗口函数COUNT() OVER (PARTITION BY Id)计算每个Id的总行数,再筛选出总行数≥15的行,这种方法不需要额外关联,效率较高:
SELECT Id, date, TotalMinutesAsleep FROM ( SELECT *, COUNT(*) OVER (PARTITION BY Id) AS id_row_count FROM `fitbit-data-exploration.FitBit_Tracker.daily sleep 1` ) WHERE id_row_count >= 15
方案二:子查询筛选符合条件的Id
先通过子查询找出拥有至少15条记录的Id列表,再用IN或JOIN关联原表获取所有行:
用IN的写法:
SELECT Id, date, TotalMinutesAsleep FROM `fitbit-data-exploration.FitBit_Tracker.daily sleep 1` WHERE Id IN ( SELECT Id FROM `fitbit-data-exploration.FitBit_Tracker.daily sleep 1` GROUP BY Id HAVING COUNT(*) >= 15 )
用JOIN的写法:
SELECT t.Id, t.date, t.TotalMinutesAsleep FROM `fitbit-data-exploration.FitBit_Tracker.daily sleep 1` t JOIN ( SELECT Id FROM `fitbit-data-exploration.FitBit_Tracker.daily sleep 1` GROUP BY Id HAVING COUNT(*) >= 15 ) valid_ids ON t.Id = valid_ids.Id
两种方案都能实现需求,窗口函数的写法更简洁,适合大多数场景;子查询的方式在数据量极大时,有时会有性能优化空间,可以根据实际情况选择。
内容的提问来源于stack exchange,提问作者Rayby
相关产品推荐
相关产品推荐

