如何将重复ID对应的多组Created Date合并至单行记录
合并重复ID的日期记录为单行,分字段展示Created Date和Duplicate Date
需求说明
现有数据库表存在ID重复的记录,每个ID对应多条Created Date,需将同一ID的日期合并至同一行,其中Created Date保留最早的日期,Duplicate Date保留该ID下的其他日期(示例中每个ID仅两条记录)。
原始数据
| ID | Created Date |
|---|---|
| 1 | 2024-07-23 00:25:17.113 |
| 1 | 2024-07-23 00:31:17.113 |
| 2 | 2024-07-23 00:22:17.113 |
| 2 | 2024-07-23 00:29:17.113 |
期望结果
| ID | Created Date | Duplicate Date |
|---|---|---|
| 1 | 2024-07-23 00:25:17.113 | 2024-07-23 00:31:17.113 |
| 2 | 2024-07-23 00:22:17.113 | 2024-07-23 00:29:17.113 |
解决方案
场景1:每个ID最多两条记录
使用窗口函数标记每条记录的顺序,再通过条件聚合提取对应字段,适用于MySQL 8.0+、PostgreSQL、SQL Server:
SELECT ID, MAX(CASE WHEN rn = 1 THEN Created_Date END) AS Created_Date, MAX(CASE WHEN rn = 2 THEN Created_Date END) AS Duplicate_Date FROM ( SELECT ID, Created_Date, -- 按ID分组,按日期升序排序,标记行号 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Created_Date) AS rn FROM your_table_name ) t GROUP BY ID;
场景2:每个ID可能有多个重复日期
如果需要将所有重复日期合并为一个字段(用分隔符拼接),可使用字符串聚合函数:
MySQL
SELECT ID, MIN(Created_Date) AS Created_Date, -- 按日期倒序拼接所有重复日期 GROUP_CONCAT(Created_Date SEPARATOR ', ' ORDER BY Created_Date DESC) AS Duplicate_Dates FROM your_table_name GROUP BY ID -- 仅保留有重复的ID HAVING COUNT(*) > 1;
PostgreSQL
SELECT ID, MIN(Created_Date) AS Created_Date, STRING_AGG(Created_Date::TEXT, ', ' ORDER BY Created_Date DESC) AS Duplicate_Dates FROM your_table_name GROUP BY ID HAVING COUNT(*) > 1;
SQL Server
SELECT ID, MIN(Created_Date) AS Created_Date, STRING_AGG(Created_Date, ', ') WITHIN GROUP (ORDER BY Created_Date DESC) AS Duplicate_Dates FROM your_table_name GROUP BY ID HAVING COUNT(*) > 1;
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

