DB2 SQL查询:筛选Name字段发生变更的行数据
筛选Client分组下Name字段发生变更的记录
需求说明
从Client_Info表中,按Client分组,筛选出每个Name首次出现的行(即Name发生变更的节点行,包含每个Client的初始记录)。
原表数据
Client Name Date 1 John 12-jun-2023 1 John 13-jun-2023 1 Mick 14-jun-2023 1 Mick 15-jun-2023 1 Paddy 16-jun-2023 2 Mary 12-jun-2023 2 Mary 13-jun-2023 2 Mary 14-jun-2023 2 Paula 15-jun-2023 2 Rita 16-jun-2023
原SQL问题分析
你之前的SQL逻辑偏差,通过关联每个Client的最新记录来对比,无法精准捕捉相邻日期的Name变更,所以得不到预期结果。
正确解法
使用LAG()窗口函数,对比同一Client下相邻行的Name值,筛选出变更节点:
SELECT Client, Name, Date FROM ( SELECT Client, Name, Date, -- 获取同一Client分组中上一行的Name值 LAG(Name) OVER (PARTITION BY Client ORDER BY Date) AS prev_name FROM Client_Info ) t -- 保留Client的首条记录,或当前行Name与上一行不同的记录 WHERE prev_name IS NULL OR Name <> prev_name ORDER BY Client, Date;
逻辑解释
- 内层查询通过
LAG(Name) OVER (PARTITION BY Client ORDER BY Date),按Client分组、Date升序排序,获取当前行的上一行Name。 - 外层筛选时,保留两种情况:
- 该
Client的第一条记录(prev_name为NULL,无前置行) - 当前行
Name与上一行不同(即Name发生变更)
- 该
- 最终按
Client和Date排序,得到符合需求的结果。
期望结果
Client Name Date 1 John 12-jun-2023 1 Mick 14-jun-2023 1 Paddy 16-jun-2023 2 Mary 12-jun-2023 2 Paula 15-jun-2023 2 Rita 16-jun-2023
内容的提问来源于stack exchange,提问作者Garret
相关产品推荐
相关产品推荐

