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

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;

逻辑解释

  1. 内层查询通过LAG(Name) OVER (PARTITION BY Client ORDER BY Date),按Client分组、Date升序排序,获取当前行的上一行Name。
  2. 外层筛选时,保留两种情况:
    • 该Client的第一条记录(prev_name为NULL,无前置行)
    • 当前行Name与上一行不同(即Name发生变更)
  3. 最终按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:05:53