如何在SQL中对比两日账户数据并添加变更说明伪列
SQL方案:标注每日账户数据的具体变更内容
要实现标注具体变更内容的需求,我们可以通过自连接对比两日数据,并使用CASE语句生成变更描述列。以下是完整的SQL解决方案:
SELECT curr.id, curr.Name, curr.DS_DW_Id, curr.flag_1, curr.flag_2, CASE WHEN curr.Name != prev.Name THEN 'Name Change' WHEN curr.DS_DW_Id != prev.DS_DW_Id THEN 'DS_DW_Id Change' WHEN curr.flag_1 != prev.flag_1 THEN 'flag_1 Change' WHEN curr.flag_2 != prev.flag_2 THEN 'flag_2 Change' ELSE 'Multiple Changes' END AS "Data Change" FROM daily_account_data curr INNER JOIN daily_account_data prev ON curr.id = prev.id WHERE curr.Insert_date = '2023-06-02' AND prev.Insert_date = '2023-06-01' AND ( curr.Name != prev.Name OR curr.DS_DW_Id != prev.DS_DW_Id OR curr.flag_1 != prev.flag_1 OR curr.flag_2 != prev.flag_2 );
方案说明:
- 自连接对比:将当日数据(
curr别名)与前日数据(prev别名)通过id关联,确保对比同一账户的两日记录。 - 过滤变更行:通过
WHERE子句筛选出至少一个字段发生变化的记录。 - 生成变更描述:使用
CASE语句逐一判断每个字段是否发生变化,返回对应的变更说明;若多个字段同时变更,返回Multiple Changes。
扩展说明:
- 如果需要处理当日新增账户(前日无记录)或前日删除账户(当日无记录),可以将
INNER JOIN改为FULL OUTER JOIN,并补充对应的逻辑判断。 - 若要同时显示多个字段的变更内容,可以使用字符串拼接(如
CONCAT函数)组合所有变更描述。
内容的提问来源于stack exchange,提问作者Arty155
相关产品推荐
相关产品推荐

