如何通过单条SQL查询按日期分组聚合对象ID集合?
解决方案:按日期分组聚合ID列表
没问题!完全可以通过单条SQL查询实现这个需求,本质就是按日期分组后把同组的ID聚合起来,不同的数据库有对应的聚合函数来搞定,我给你梳理几种常用场景的写法:
先明确原表结构与数据
原表结构
CREATE TABLE your_table ( id VARCHAR(50), start TIMESTAMP );
原数据
| id | start |
|---|---|
| 06c561305383482e98064ssdfd6ccf74 | 2019-08-30 14:41:40.697301 |
| 0aec07d9acdd48c485ab3sfhsffdsa8c | 2019-09-02 05:45:09.274541 |
| 0d240asdfasd49579e2be8821b908fdc | 2019-09-02 05:45:08.745885 |
| 00al4eebb9a34sdsdfsdff128518dc4f | 2019-08-30 14:42:29.094314 |
各数据库实现方式
1. MySQL 5.7+
用GROUP_CONCAT函数来聚合ID,搭配DATE()提取日期部分:
SELECT DATE(start) AS date, CONCAT('- ', GROUP_CONCAT(id SEPARATOR '\n- ')) AS ids FROM your_table GROUP BY DATE(start);
查询结果里的ids字段会直接生成带列表前缀的格式,和你想要的结构很接近。
2. PostgreSQL
用STRING_AGG做字符串聚合,或者ARRAY_AGG生成数组(方便应用层处理):
字符串聚合写法
SELECT DATE(start) AS date, CONCAT('- ', STRING_AGG(id, '\n- ')) AS ids FROM your_table GROUP BY DATE(start);
数组聚合写法(推荐应用层处理格式)
SELECT DATE(start) AS date, ARRAY_AGG(id) AS ids_array FROM your_table GROUP BY DATE(start);
拿到数组后,在应用里遍历就能轻松生成你要的列表格式。
3. SQL Server 2017+
用STRING_AGG函数,注意用CHAR(10)表示换行:
SELECT CONVERT(DATE, start) AS date, CONCAT('- ', STRING_AGG(id, CHAR(10) + '- ')) AS ids FROM your_table GROUP BY CONVERT(DATE, start);
额外提示
如果你的数据库版本较低,不支持这些聚合函数,可以用窗口函数或者自连接的方式实现,但上面的写法是最简洁高效的。另外,要是需要严格输出成你展示的那种文本格式,建议在查询得到聚合结果后,在应用程序层面做最终的格式拼接,这样会更灵活可控。
内容的提问来源于stack exchange,提问作者kedod
相关产品推荐
相关产品推荐

