SQL如何获取其他行的最小值填充至Station行的空值字段?
问题原因
你现有的写法错误在于窗口函数的分区规则包含了stop_type和vehicle_stop_number,这会导致Station类型和Dropoff类型的行被划分到不同分区,无法跨类型获取到Dropoff对应的时间值。
正确实现SQL
SELECT * ,CASE WHEN stop_type = 'Station' AND enter_time IS NULL THEN -- 判断是否存在Dropoff的enter_time为null,有则返回null CASE WHEN has_null_dropoff > 0 THEN NULL ELSE min_dropoff_time END ELSE enter_time END AS enter_time_actuals FROM ( SELECT * -- 计算同组所有Dropoff的最小enter_time,非Dropoff行也能拿到这个值 ,MIN(CASE WHEN stop_type = 'Dropoff' THEN enter_time END) OVER(PARTITION BY date, route_id, employee_id) AS min_dropoff_time -- 统计同组内Dropoff的enter_time为null的数量,用于边界判断 ,SUM(CASE WHEN stop_type = 'Dropoff' AND enter_time IS NULL THEN 1 ELSE 0 END) OVER(PARTITION BY date, route_id, employee_id) AS has_null_dropoff FROM stops ) t
逻辑说明
- 分区仅保留
date、route_id、employee_id三个公共维度,确保同一条路线、同一天、同一个员工的所有站点行归属同一个分区 - 条件聚合仅统计
stop_type='Dropoff'的行的最小enter_time,分区内所有行都能访问到这个统计值 - 额外统计同分区内
Dropoff类型的enter_time为空的行数,只要行数大于0就给Station行赋值空,完全符合边界处理规则 - 非
Station类型的行直接保留原始的enter_time值,不需要修改
内容的提问来源于stack exchange,提问作者Neeraj Grover
相关产品推荐
相关产品推荐

