为每个条目更改了最后两行的列

时间:2018-03-21 11:23:21

标签: sql

我想监视重要列的更改(重要),并仅显示有更改的行。对于每个文档,每个更改都记录有序列更改ID(例如,文档#1在非重要列中更改#1,在非重要列中更改#2,在IMPORTANT列中更改#3) - 我想在输出DocNum#1,changeID#3,'Column Changed'。

我正在尝试捕获每个文档(DocNum)的最后一个更改实例的重要列中的更改 - 并且仅显示更改位于重要列中的行。

我想过这样的事情,但这不起作用:(

    SELECT 
        DocNum, 
        changeID, 
        'Important' AS 'Column Changed' 
    FROM (
        SELECT 
            DISTINCT changeID, 
            DocNum, 
            Important
        FROM ADOC
        ) AS DifferenceInImportant
    WHERE 
        changeID IN (
            SELECT 
                TOP(1) TT0.changeID
            FROM 
                ADOC TT0 
            WHERE 
                TT0.DocNum=DocNum 
            ORDER BY TT0.changeID DESC
        )
    GROUP BY changeID, DocNum
    HAVING COUNT(*) > 1

示例:输入数据(没有空行,只是为了良好的方向)

DocNum changeID DueDate
000001 00000001 0101-18
000001 00000002 0201-18
000001 00000003 0201-18
000001 00000004 0301-18

000002 00000001 0201-18
000002 00000002 0201-18

000003 00000001 0101-18
000003 00000002 0201-18

000004 00000001 0301-18
000004 00000002 0401-18
000004 00000003 0401-18

预期结果(只有那些行,最后一次更改 - 具有最后更改ID的条目 - 在DueDate中)

DocNum changeID DueDate
000001 00000004 'Changed Column'
000003 00000002 'Changed Column'

1 个答案:

答案 0 :(得分:0)

我会使用ANSI标准lag()函数执行此操作。假设important不包含NULL值:

select a.*
from (select a.*,
             lag(important) over (partition by docnum order by changeid) as prev_important
      from ADOC a 
     ) a
where prev_important is null or prev_important <> important;

可以对其进行修改以处理NULL值,但这可以解决这个问题。