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