有一个表,存储每天的帐户数据.我想找出今天和昨天的数据有什么不同.表创建和INSERT语句的查询如下:

CREATE TABLE daily_account_data (id varchar(6), Name varchar (20), DS_DW_Id varchar(4), flag_1 varchar(5), flag_2 varchar(5), Insert_date date );

INSERT INTO daily_account_data VALUES('A01R11', 'Gene Graham',      'PT12', 'TRUE', 'FALSE', '2023-06-01');
INSERT INTO daily_account_data VALUES('A01R16', 'Molly Ringwald',   'PT15', 'TRUE', 'TRUE',  '2023-06-01');
INSERT INTO daily_account_data VALUES('A01R19', 'John Doe',         'PT24', 'FALSE','TRUE',  '2023-06-01');
INSERT INTO daily_account_data VALUES('A01R34', 'Jane Doe',         'PT26', 'TRUE', 'FALSE', '2023-06-01');
INSERT INTO daily_account_data VALUES('A01R11', 'Gene Wilder',      'PT12', 'TRUE', 'FALSE', '2023-06-02');
INSERT INTO daily_account_data VALUES('A01R16', 'Molly Ringwald',   'PT15', 'TRUE', 'TRUE',  '2023-06-02');
INSERT INTO daily_account_data VALUES('A01R19', 'John Doe',         'PT24', 'TRUE', 'TRUE',  '2023-06-02');
INSERT INTO daily_account_data VALUES('A01R34', 'Jane Doe',         'PT26', 'TRUE', 'FALSE', '2023-06-02');

我有一个查询来找出这两天的数据的差异.

SELECT id, name, DS_DW_Id, flag_1, flag_2 FROM daily_account_data WHERE Insert_date = '2023-06-02'
EXCEPT
SELECT id, name, DS_DW_Id, flag_1, flag_2 FROM daily_account_data WHERE Insert_date = '2023-06-01';

但是我不知道如何获取伪列中的数据.最后一列是更改的数据.在6月1日的数据中,ID A01R11的名字是吉恩·格雷厄姆,在2日的数据中是吉恩·怀尔德.伪列应显示"名称更改".

同样,对于id A01R19(John Doe),FLAG_1的值已更改为TRUE.伪列应该显示"FLAG_1 CHANGE".

输出应如下所示:

id Name DS_DW_Id flag_1 flag_2 Data Change
A01R11 Gene Wilder PT12 TRUE FALSE Name Change
A01R19 John Doe PT24 TRUE TRUE flag_1 Change

推荐答案

您可以连接该表并减go 日期. 如果记录顺序正确(前一天必须是前一条记录,可以使用窗口函数(Lead))

select 
         a.id
        ,a.Name
        ,a.DS_DW_Id
        ,a.flag_1
        ,a.flag_2

        ,iif(a.Name=b.Name ,'',' Name Change') 
        +iif(a.DS_DW_Id=b.DS_DW_Id ,'',' DS_DW_Id Change')
        +iif(a.flag_1=b.flag_1 ,'',' flag_1 Change')
        +iif(a.flag_2=b.flag_2 ,'',' flag_2 Change') AS [Data Change]

from daily_account_data a
inner join(
            select *
            from daily_account_data b
)b on   a.id=b.id 
and DATEADD(day,-1, b.Insert_date)=a.Insert_date
where a.Name<>b.Name 
        or  a.DS_DW_Id<>b.DS_DW_Id   
        or    a.flag_1<>b.flag_1
        or    a.flag_2<>b.flag_2

Sql相关问答推荐

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

Oracle分层查询-两条路径在末尾合并为一条

Oracle 23c ROUND,数据类型为DATE

仅在日期相隔时递增(Oracle SQL)

合并分层表SQL中的第一个非空、变化的空位置

从另一个没有公共键的表中获取值来加入

具有分组条件的不同计数 (DAX)

在特定条件下使用 LAG,确定要采用什么 LAG 值?

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

基于字符串的SQL查询

基于源表的 SQL INSERT、UPDATE 和 DELETE

使用标准SQL 触发更新当前日期

SQL 查询以填充单个列中的所有值

如何找到特定时间间隔内的最大和最小日期?

Select 随机行,使得列子组的组合是唯一的

在 AWS athena 的视图之上创建视图时,如何消除此错误:列别名列表有 1 个条目但t有 4 列可用?

如何部分转置表格

复制到比.从snowflake的外部stage表演中插入?

SQLite 中标识符周围的方括号是什么意思?