Sql 从审核表中选择已更改的行

Sql 从审核表中选择已更改的行,sql,sql-server,Sql,Sql Server,我有一个审计表,当用户更改零件清单的标称代码时,它会记录日志 如您所见,第一列是零件,第二列是日期更改,第三列是名义代码。 这只是数据的一个示例,表实际上有大量的行 我只想带回那些名义代码已经改变的部分,展示它最初是什么,现在是什么。 基本上有一个bug,其中一个进程不断地更改代码,所以我需要知道它以前是什么 | PART | DATE CHANG | Nominal code |------------|------------|------- | ENGINEWORK | 05/

我有一个审计表,当用户更改零件清单的标称代码时,它会记录日志

如您所见,第一列是零件,第二列是日期更改,第三列是名义代码。 这只是数据的一个示例,表实际上有大量的行

我只想带回那些名义代码已经改变的部分,展示它最初是什么,现在是什么。 基本上有一个bug,其中一个进程不断地更改代码,所以我需要知道它以前是什么

| PART | DATE CHANG | Nominal code |------------|------------|------- | ENGINEWORK | 05/08/2014 | 4000 | | ENGINEWORK | 06/08/2014 | 4007 | | ENGINEWORK | 04/09/2014 | 4007 | | ENGINEWORK | 05/09/2014 | 4007 | | ENGINEWORK | 15/09/2014 | 4007 | | ENGINEWORK | 25/09/2014 | 4007 | | HYPOIDOIL | 05/08/2014 | 4005 | | HYPOIDOIL | 07/08/2014 | 4005 | | HYPOIDOIL | 08/08/2014 | 4000 | | HYPOIDOIL | 14/08/2014 | 4000 | | LLB382 | 05/08/2014 | 5000 | | LLB382 | 07/08/2014 | 4000 | | LLB382 | 07/08/2014 | 5000 | | LLB382 | 08/08/2014 | 4000 | | LLB382 | 14/08/2014 | 4000 | | LLB382 | 20/10/2014 | 4000 |
您似乎想要代码的第一个和最后一个值。我建议窗口功能:

with t as (
      select t.*, row_number() over (partition by part order by datechange) as seqnum,
             count(*) over (partition by part) as cnt
      from audit t
     )
select part,
       max(case when seqnum = 1 then nominalcode end) as firstcode,
       max(case when seqnum = cnt then nominalcode end) as lastcode
from t
group by part
having max(case when seqnum = 1 then nominalcode end) <> max(case when seqnum = cnt then nominalcode end);

我相信您期望的结果集会在每次零件号更改时显示出来。每次代码更改零件的值和事件发生的日期时,此查询都会找到

    with rankedResult
    as (
        select t.*,
            row_number() over (
                partition by part order by dateChanged
                ) as seqnum
        from Audit t
        )
    select t.part,
        t.code CurrentCode,
        t2.code ChangedToCode,
        t2.dateChanged ChangedDate
    from rankedResult t
    inner join rankedResult t2 on t.part = t2.part
        and t.seqnum = t2.seqnum + 1
        and t.code != t2.code;

抱歉,注意已成功设置表格格式…请给我一分钟我尝试过:“选择零件、minauditdate、maxauditdate、来自零件的销售代码\u gl\u Audit where part in select part from\u Parts\u Audit where sales\u gl\u code!=”4000“按部分分组,销售代码我不确定它是否正确谢谢你,尽管我在关键字“where”附近得到了一个“Msg 156,Level 15,State 1,Line 11”错误语法。当我运行它时,我所更改的只是查询中的列名。