ClickHouse中如何从GROUP BY查询结果提取每个日期分组的首行数据
可以直接修改原有GROUP BY语句得到目标结果,无需嵌套子查询,也支持基于现有查询嵌套实现,两种实现方案如下:
最简实现(直接修改原查询,ClickHouse专属语法,性能最优)
ClickHouse提供专属的LIMIT n BY 分组字段语法,作用是按指定字段分组后,每组返回前n条记录。你只需要在原有查询的末尾新增一行LIMIT 1 BY Date即可:
SELECT Date, Name, COUNT(Certificates) as Certificates FROM Students.data GROUP BY Date, Name ORDER BY Date, Name LIMIT 1 BY Date;
因为你原有查询已经通过ORDER BY Date, Name保证了每个日期下的记录按姓名升序排序,加上述限制后会自动取每个日期的第一条记录,完全匹配你的预期输出。
嵌套子查询实现(标准SQL写法,兼容性更强)
如果你需要将现有查询作为子查询嵌套使用,可以用窗口函数ROW_NUMBER实现分组取Top1逻辑:
SELECT Date, Name, Certificates FROM ( -- 原有查询逻辑作为内层子查询,新增分组排序序号 SELECT Date, Name, COUNT(Certificates) as Certificates, ROW_NUMBER() OVER (PARTITION BY Date ORDER BY Name ASC) AS row_num FROM Students.data GROUP BY Date, Name ) AS sub_query WHERE row_num = 1 ORDER BY Date;
内容的提问来源于stack exchange,提问作者Shaikh Abuzar
相关产品推荐
相关产品推荐

