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

合并列并替换NULL值:logistics表SQL查询优化需求

解决方案

你已经完成了日期合并的部分,现在只需要补充处理stored类型记录中quantity为NULL的情况。这里提供两种简洁的实现方式:

方法一:使用窗口函数(推荐)

窗口函数可以直接在原数据集上计算出每个campaign对应的ordered数量,不需要额外的表连接,代码更简洁高效:

SELECT 
    campaign,
    event_type,
    COALESCE(date_offered, date_ordered, date_delivered) AS event_date,
    COALESCE(
        quantity,
        MAX(CASE WHEN event_type = 'ordered' THEN quantity END) OVER (PARTITION BY campaign)
    ) AS quantity
FROM logistics
ORDER BY campaign, event_type;

逻辑解释:

  • COALESCE(quantity, ...):优先使用当前记录的quantity,如果为NULL则执行后面的逻辑
  • MAX(CASE WHEN event_type = 'ordered' THEN quantity END) OVER (PARTITION BY campaign):在同一个campaign分组内,筛选出event_type为ordered的quantity值(因为每个活动只有一条ordered记录,MAX函数会精准拿到该值)
  • 最后按campaign和event_type排序,让结果与预期完全匹配

方法二:使用子查询连接

如果你更习惯用表连接的方式,也可以先通过子查询提取每个campaign的ordered数量,再左连接到原表:

SELECT 
    l.campaign,
    l.event_type,
    COALESCE(l.date_offered, l.date_ordered, l.date_delivered) AS event_date,
    COALESCE(l.quantity, o.quantity) AS quantity
FROM logistics l
LEFT JOIN (
    SELECT campaign, quantity 
    FROM logistics 
    WHERE event_type = 'ordered'
) o ON l.campaign = o.campaign
ORDER BY l.campaign, l.event_type;

逻辑解释:

  • 子查询o先获取所有活动的ordered数量
  • 左连接保证原表的所有记录都被保留,当原表quantity为NULL时,用连接过来的o.quantity填充

两种方法都能得到你想要的预期结果,根据你的实际场景选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:22:40