DB2 LUW数据库检测指定account_type列表内值变更的SQL查询需求
DB2 LUW 账户类型变更筛选SQL实现
前提假设
- 业务表名暂定为
client_accounts,可根据实际表名替换 client+customer_org_ID为唯一账户识别键,用于关联同一账户的历史版本- 表中保留账户所有历史变更版本(即每次更新插入新行,而非覆盖旧数据),如果仅存储最新数据需要关联对应审计历史表使用
实现逻辑
- 用DB2内置的
LAG()窗口函数提取同一账户上一版本的account_type值 - 筛选规则:
- 仅保留
account_type发生变更的记录,排除仅active_Y_N或其他字段变更的场景 - 覆盖两类变更:转入(旧值不在指定列表、新值在列表)、转出(旧值在指定列表、新值不在列表)
- 仅保留
完整SQL代码
WITH account_version AS ( SELECT client, account_type, customer_org_ID, insert_date, update_date, active_Y_N, -- 按更新时间排序,取同一账户上一版本的账户类型 LAG(account_type, 1) OVER ( PARTITION BY client, customer_org_ID ORDER BY update_date ASC, insert_date ASC ) AS prev_account_type FROM client_accounts ) SELECT client, account_type, customer_org_ID, insert_date, update_date, active_Y_N FROM account_version WHERE -- 账户类型确实发生变更 account_type <> prev_account_type -- 变更前后至少有一个值属于指定列表,覆盖转入/转出场景 AND ( account_type IN ('CAM','CAMADP','CAMHD','CAMHDADP','DIST','DISTADP','GAM','GAMADP','LAM','LAMADP') OR prev_account_type IN ('CAM','CAMADP','CAMHD','CAMHDADP','DIST','DISTADP','GAM','GAMADP','LAM','LAMADP') ) -- 若需要过滤账户首次新增的记录,可添加条件 AND prev_account_type IS NOT NULL -- 若只需要返回最新变更记录,可添加 ORDER BY update_date DESC FETCH FIRST 1 ROWS ONLY
内容的提问来源于stack exchange,提问作者Alex Prado
相关产品推荐
相关产品推荐

