合并列并替换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
相关产品推荐
相关产品推荐

