gpt4 book ai didi

sql-server - 用于显示数据更改历史记录的 SQL 查询

转载 作者:行者123 更新时间:2023-12-01 06:21:46 24 4
gpt4 key购买 nike

我在 SQL Server 数据库中有一个表,它每天存储历史数据。结构如下图所示:

UploadDate    TypeID    Value1   Value2
-------------------------------------------
2012-01-08 1 NEG 1998-02-05
2012-01-08 2 NEG 1999-02-09
2012-01-08 3 STABLE 1997-02-06
2012-02-08 1 NEG 1998-02-05
2012-02-08 2 NEG 1999-02-09
2012-03-08 1 POS 2012-03-08
2012-03-08 2 STABLE 2012-01-08

正如您在上面看到的 TypeID 1 & 2, Value1Value2已于 2012-03-08 更改

我的要求是我必须只显示那些从以前的值改变的行。

在这种情况下,因为 TypeID 1 和 2 已更改而不是应显示当前和最接近的先前值。而对于 TypeID 3 因为它没有改变,它只会显示最新的值。结果集如下所示:
UploadDate    TypeID    Value1   Value2
-------------------------------------------
2012-01-08 3 STABLE 1997-02-06
2012-02-08 1 NEG 1998-02-05
2012-02-08 2 NEG 1999-02-09
2012-03-08 1 POS 2012-03-08
2012-03-08 2 STABLE 2012-01-08

知道如何使用 SQL 解决这个问题吗?

最佳答案

Uninspired 版本在有序集合上使用自连接来检查按时间顺序排列的相同 typeid 的前一行的值。如果没有前一行或值不同,则输出该行。

; with numbered as (
select *,
row_number() over (order by typeid, uploaddate) rn
from table1
)
select n1.*
from numbered n1
left join numbered n2
on n1.TypeID = n2.TypeID
and n1.rn + 1 = n2.rn
where (n2.rn is null
or n1.value1 <> n2.value1
or n1.value2 <> n2.value2)
order by typeid, uploaddate

Here is Sql Fiddle with example .

更新 : 另一个不需要自加入但需要分组的变体。相同 typeid、value1 和 value2 的每个时间线都被赋予唯一的 group_number,稍后用于提取组的 max(uploaddate)。
; with numbered as (
select *,
row_number() over (order by typeid, uploaddate)
- row_number() over (partition by typeid, value1, value2
order by uploaddate) group_number
from table1
)
select max(uploaddate) uploaddate, typeid, value1, value2
from numbered
group by typeid, value1, value2, group_number
order by typeid, uploaddate

Another Sql Fiddle .

关于sql-server - 用于显示数据更改历史记录的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11854673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com