基于前一行值筛选:能否用单条SQL实现prop从4到5的实体筛选?
用单条SQL筛选prop从4变更为5的实体
当然可以用单条SQL优雅实现这个需求!核心思路是利用**窗口函数LAG()**追踪每个实体按时间排序后的上一条属性值,直接筛选出符合条件的记录即可。
基础实现(仅获取符合条件的实体)
SELECT DISTINCT entity FROM ( SELECT entity, prop, -- 按entity分组、dt升序,获取当前记录的上一条prop值 LAG(prop) OVER (PARTITION BY entity ORDER BY dt) AS previous_prop FROM T1 ) AS entity_prop_history -- 筛选"当前prop为5,且上一条prop为4"的变更记录 WHERE prop = 5 AND previous_prop = 4;
扩展实现(查看具体变更时间)
如果需要知道每个实体从prop=4变为prop=5的具体时间点,可以调整查询字段:
SELECT entity, dt AS prop_changed_to_5_dt, LAG(dt) OVER (PARTITION BY entity ORDER BY dt) AS prop_was_4_dt FROM ( SELECT entity, dt, prop, LAG(prop) OVER (PARTITION BY entity ORDER BY dt) AS previous_prop FROM T1 ) AS entity_prop_history WHERE prop = 5 AND previous_prop = 4;
代码逻辑说明
LAG(prop) OVER (PARTITION BY entity ORDER BY dt):PARTITION BY entity:将数据按实体分组,确保只在同一实体的记录范围内查找前一条数据ORDER BY dt:每个组内按时间升序排列,保证拿到的是时间线的上一条记录LAG(prop):提取当前记录的上一条记录的prop值,命名为previous_prop
- 外层查询通过
WHERE条件精准定位“属性从4变为5”的变更节点 - 用
DISTINCT是为了避免同一个实体多次发生4→5变更时重复输出(不需要去重可直接去掉)
内容的提问来源于stack exchange,提问作者Player
相关产品推荐
相关产品推荐

