You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GroupBy提取首个有效值并新增列合并重复行的技术需求

行合并与差异字段提取解决方案(Jobs表)

看起来你需要对Jobs表进行行合并:将共享同一Order_ID(哪怕部分行缺失该值)的记录合并为一行,同时把不同Type对应的CreatedTime拆分到单独的新列中。下面是适配常见数据库方言的实用方案:

第一步:先明确整理后的原始数据示例

先把你给出的零散数据整理成更清晰的表格形式,方便理解需求:

Order_IDTypeCreatedTime
5Collect1000000000
5DeliverNULL
5Deliver1100000000
8Collect2000000000
8CollectNULL
NULLCollect1500000000

第二步: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_IDTypesCollect_CreatedTimeDeliver_CreatedTime
5Collect, Deliver10000000001100000000
8Collect2000000000NULL
8Collect1500000000NULL

内容的提问来源于stack exchange,提问作者AndrewB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:27:48