[英]SQL Query Table for Changes to record based on previous record (SQL Server)
对于即将来临的问题,我深表歉意,但是我在这里可能有些烦恼……SQL不是我受过训练的东西,它是一种边学边学的方法。 我正在尝试查询SQL Server 2008中的现有单个表( 在SQL Server 2000的兼容模式下 )。
该表的结构类似于以下内容:
Table1
+----------+----------+----------+---------+---------+---------+------------+---------+
| Date | RecordID | Revision | AttribA | AttribB | AttribC | AttribD | AttribE |
+----------+----------+----------+---------+---------+---------+------------+---------+
| 1/1/2014 | 1 | 0 | mammal | horse | slimy | tasty | Grade 4 |
| 1/1/2014 | 1 | 1 | mammal | dog | slimy | tasty | Grade 3 |
| 1/1/2014 | 1 | 2 | mammal | dog | soft | tasty | Grade 2 |
| 1/1/2014 | 1 | 3 | mammal | dog | soft | lick | Grade 2 |
| 1/1/2014 | 2 | 0 | puppet | sock | soft | less tasty | Grade 9 |
| 1/1/2014 | 2 | 1 | puppet | sock | soft | not tasty | Grade 9 |
+----------+----------+----------+---------+---------+---------+------------+---------+
RecordID
和RevisionNum
是Primary Keys
。 作为审核历史记录的形式, Table1
RecordID
存储的单个RecordID
可能有多个修订版本。
另外,假设AttributeA和AttributeB非正式地关联为Group A,AttributeC和AttributeD关联为Group B,而AttributeE单独关联为GroupC。
我的任务是编写一个给定RecordID
的查询,该查询将返回以下内容:
+----------+----------+----------+---------+---------+---------+
| Date | RecordID | Revision | Group A | Group B | Group C |
+----------+----------+----------+---------+---------+---------+
| 1/1/2014 | 1 | 0 | | | |
| 1/1/2014 | 1 | 1 | X | | X |
| 1/1/2014 | 1 | 2 | | X | X |
| 1/1/2014 | 1 | 3 | | X | |
+----------+----------+----------+---------+---------+---------+
如果“组”中的任何列已从先前的值更新,则查询将为带有“ X”的单个记录的每个修订返回条目。
到目前为止,我最好的尝试是:
DECLARE @ID INTEGER
DECLARE @Revision INTEGER
SET @ID = 1
SET @Revision = 3
...
SET @GroupA = (SELECT COUNT(*) FROM
(SELECT DISTINCT AttribA, AttribB
FROM [dbo].[Table1]
WHERE RecordID = @ID
AND RevisionID in (@Revision ,@Revision -1)) A)
...
SELECT @ID
,[RevisionID]
,[Date]
,[GroupA] =
CASE
WHEN @GroupA = 1 THEN ''
ELSE 'X'
END
...
FROM [dbo].[Table1]
WHERE RecordID = @ID
AND RevisionID = @Revision
我已经剪掉了一些重复的代码来向您展示一般策略,但是老实说,我认为这是一团糟,我怀疑我能够在不将其变成噩梦的情况下进行补救。 谁能给我一个提示,告诉他们如何更好地完成SQL Server 2000兼容性中描述的任务? 感谢您的协助。
尝试下面的SQL:
UPDATED将内部联接更改为左联接。 ;)
select a.RecordId,a.Revision
, Case When a.AttribA +' '+a.AttribB <> ab.[Group A] then 'X' else '' End as 'Group A'
, Case When a.AttribC +' '+a.AttribD <> ab.[Group B] then 'X' else '' End as 'Group B'
, Case When a.AttribE <> ab.[Group C] then 'X' else '' End as 'Group C'
, a.AttribA +' '+a.AttribB as 'Group A'
, a.AttribC+ ' ' + a.AttribD as 'Group B'
, a.AttribE as 'Group C'
, ab.[Group A] as 'PrevRevision A'
, ab.[Group B] as 'PrevRevision B'
, ab.[Group C] as 'PrevRevision C'
from @tempData a
left join
(
select b.RecordId,b.Revision
, b.AttribA +' '+b.AttribB as 'Group A'
, b.AttribC+ ' ' + b.AttribD as 'Group B'
, b.AttribE as 'Group C'
from @tempData b
) ab on a.RecordId=ab.RecordId and a.Revision = ab.Revision + 1
order by a.RecordId, a.Revision
结果数据:
RecordId Revision Group A Group B Group C Group A Group B Group C PrevRevision A PrevRevision B PrevRevision C
----------- ----------- ------- ------- ------- ------------- --------------- -------- ---------------- ---------------- ---------------
1 0 mammal horse slimy tasty Grade 4 NULL NULL NULL
1 1 X X mammal dog slimy tasty Grade 3 mammal horse slimy tasty Grade 4
1 2 X X mammal dog soft tasty Grade 2 mammal dog slimy tasty Grade 3
1 3 X mammal dog soft lick Grade 2 mammal dog soft tasty Grade 2
2 0 puppet sock soft less tasty Grade 9 NULL NULL NULL
2 1 X puppet sock soft not tasty Grade 9 puppet sock soft less tasty Grade 9
我不知道SQL Server 2000的局限性,但是也许这种方法可行:
select
RecordID,
Revision,
AttribA,
AttribB,
( select 'X'
from t1 as B
where B.RecordID = A.RecordID
and B.Revision = A.revision - 1
and (B.AttribA <> A.AttribA or B.AttribB <> A.AttribB)
) AS GroupA
from t1 as A
where RecordID = 1
;
这是一个显示它正在运行的小提琴: http : //sqlfiddle.com/#!3/b4626e/6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.