基于GroupBy提取首个有效值并新增列合并重复行的技术需求
行合并与差异字段提取解决方案(Jobs表)
看起来你需要对Jobs表进行行合并:将共享同一Order_ID(哪怕部分行缺失该值)的记录合并为一行,同时把不同Type对应的CreatedTime拆分到单独的新列中。下面是适配常见数据库方言的实用方案:
第一步:先明确整理后的原始数据示例
先把你给出的零散数据整理成更清晰的表格形式,方便理解需求:
| Order_ID | Type | CreatedTime |
|---|---|---|
| 5 | Collect | 1000000000 |
| 5 | Deliver | NULL |
| 5 | Deliver | 1100000000 |
| 8 | Collect | 2000000000 |
| 8 | Collect | NULL |
| NULL | Collect | 1500000000 |
第二步:SQL实现方案
这个方案会先填充缺失的Order_ID(利用组内非空值),再合并行并提取差异字段:
WITH Filled_Jobs AS ( SELECT Order_ID, Type, CreatedTime, -- 填充同Type组内的缺失Order_ID:优先取组内非空的Order_ID FIRST_VALUE(Order_ID) OVER ( PARTITION BY Type ORDER BY CASE WHEN Order_ID IS NOT NULL THEN 0 ELSE 1 END ) AS Filled_Order_ID FROM Jobs ) SELECT Filled_Order_ID AS Order_ID, -- 合并组内去重后的Type STRING_AGG(DISTINCT Type, ', ') AS Types, -- 提取Collect类型的非空CreatedTime(取最大值,也可换成STRING_AGG保留所有值) MAX(CASE WHEN Type = 'Collect' THEN CreatedTime END) AS Collect_CreatedTime, -- 提取Deliver类型的非空CreatedTime MAX(CASE WHEN Type = 'Deliver' THEN CreatedTime END) AS Deliver_CreatedTime FROM Filled_Jobs GROUP BY Filled_Order_ID;
方言适配说明
- 如果使用MySQL,把
STRING_AGG替换为GROUP_CONCAT(DISTINCT Type SEPARATOR ', ') - 如果需要保留同Type的所有非空时间(而非取最大值),可以把
MAX(...)换成STRING_AGG(CASE WHEN ... AND CreatedTime IS NOT NULL THEN CreatedTime END, ', ')
第三步:合并后的结果示例
执行上述SQL后,你会得到如下简洁的合并结果:
| Order_ID | Types | Collect_CreatedTime | Deliver_CreatedTime |
|---|---|---|---|
| 5 | Collect, Deliver | 1000000000 | 1100000000 |
| 8 | Collect | 2000000000 | NULL |
| 8 | Collect | 1500000000 | NULL |
内容的提问来源于stack exchange,提问作者AndrewB
相关产品推荐
相关产品推荐

