Sql server 如何查找状态更新以及更新者
我正在处理一个大型SQL表,186列,257899行,并且正在计数。每当主数据中的某些内容发生更改时,就会将其添加到。这是Sql server 如何查找状态更新以及更新者,sql-server,set-based,Sql Server,Set Based,我正在处理一个大型SQL表,186列,257899行,并且正在计数。每当主数据中的某些内容发生更改时,就会将其添加到。这是shadow表的一部分,它允许我们查看不同字段的审核历史记录 我需要做的是看看谁更新了,何时更新,以及更新的特定顺序。我需要找到任何时候有3个用户更新了主表去 比尔=>活动 账单=>没有账单 活动=>正在进行中 我需要收集的是 正在切换的状态及其切换到的内容(从列表中) (上图) 从下面的3个用户列表中进行更新的用户的名称 更新的日期时间 索赔编号 我正在寻找的用户无法提
shadow
表的一部分,它允许我们查看不同字段的审核历史记录
我需要做的是看看谁更新了,何时更新,以及更新的特定顺序。我需要找到任何时候有3个用户更新了主表去
- 比尔=>活动
- 账单=>没有账单
- 活动=>正在进行中
- 用户1
- 用户2
- 用户3
#TestingData
作为数据表,创建#TestingTable
作为阴影表,然后填充样本数据
create table #TestingTable(Id int,SMState varchar(50),UpdatedBy varchar(50),UpdatedOn datetime,cd_ClaimNumber varchar(50))
create table #TestingData(Id int,SMState varchar(50),UpdatedBy varchar(50),UpdatedOn datetime,cd_ClaimNumber varchar(50))
insert into #TestingData([Id],[UpdatedBy],[UpdatedOn],[cd_ClaimNumber],SMState)
Values (1,'John Doe','2015-10-25 12:00:00',208692,'Bill'),
(2,'John Doe','2015-10-25 12:00:00',297983,'Bill'),
(3,'John Doe','2015-10-25 13:00:00',697920,'Bill'),
(4,'John Doe','2015-10-25 12:00:00',992196,'Bill')
INSERT INTO #TestingTable([Id],[UpdatedBy],[UpdatedOn],[cd_ClaimNumber],SMState)
VALUES
(1,'John Jones','2015-10-24 13:00:00',208692,'No Bill'),
(2,'John Jones','2015-10-24 12:00:00',208692,'Bill'),
(3,'John Jones','2015-10-23 12:00:00',208692,'In Progress'),
(4,'John Jones','2015-10-22 16:00:00',208692,'Active'),
(5,'John Jones','2015-10-22 14:00:00',208692,'No Bill'),
(6,'John Jones','2015-10-22 12:00:00',208692,'Bill'),
(7,'John Jones','2015-10-24 12:00:00',297983,'Bill'),
(8,'John Jones','2015-10-23 14:00:00',297983,'Active'),
(9,'John Jones','2015-10-23 13:00:00',297983,'In Progress'),
(10,'John Jones','2015-10-23 12:00:00',297983,'Active'),
(11,'John Jones','2015-10-22 12:00:00',297983,'Bill'),
(12,'Jeffery Sampson','2015-10-24 13:00:00',697920,'No Bill'),
(13,'Jeffery Sampson','2015-10-24 12:00:00',697920,'Bill'),
(14,'Jeffery Sampson','2015-10-23 12:00:00',697920,'In Progress'),
(15,'Jeffery Sampson','2015-10-22 16:00:00',697920,'Active'),
(16,'Jeffery Sampson','2015-10-22 14:00:00',697920,'No Bill'),
(17,'Jeffery Sampson','2015-10-22 12:00:00',697920,'Bill'),
(18,'Jeffery Sampson','2015-10-24 12:00:00',992196,'Bill'),
(19,'Jeffery Sampson','2015-10-23 14:00:00',992196,'Active'),
(20,'Jeffery Sampson','2015-10-23 13:00:00',992196,'In Progress'),
(21,'Jeffery Sampson','2015-10-23 12:00:00',992196,'Active'),
(22,'Jeffery Sampson','2015-10-22 12:00:00',992196,'Bill')
下面是使用上述数据时阴影表的外观:
+----+-------------+-----------------+---------------------+----------------+
| Id | SMState | UpdatedBy | UpdatedOn | cd_ClaimNumber |
+----+-------------+-----------------+---------------------+----------------+
| 1 | No Bill | John Jones | 24.10.2015 13:00:00 | 208692 |
| 2 | Bill | John Jones | 24.10.2015 12:00:00 | 208692 |
| 3 | In Progress | John Jones | 23.10.2015 12:00:00 | 208692 |
| 4 | Active | John Jones | 22.10.2015 16:00:00 | 208692 |
| 5 | No Bill | John Jones | 22.10.2015 14:00:00 | 208692 |
| 6 | Bill | John Jones | 22.10.2015 12:00:00 | 208692 |
| 7 | Bill | John Jones | 24.10.2015 12:00:00 | 297983 |
| 8 | Active | John Jones | 23.10.2015 14:00:00 | 297983 |
| 9 | In Progress | John Jones | 23.10.2015 13:00:00 | 297983 |
| 10 | Active | John Jones | 23.10.2015 12:00:00 | 297983 |
| 11 | Bill | John Jones | 22.10.2015 12:00:00 | 297983 |
| 12 | No Bill | Jeffery Sampson | 24.10.2015 13:00:00 | 697920 |
| 13 | Bill | Jeffery Sampson | 24.10.2015 12:00:00 | 697920 |
| 14 | In Progress | Jeffery Sampson | 23.10.2015 12:00:00 | 697920 |
| 15 | Active | Jeffery Sampson | 22.10.2015 16:00:00 | 697920 |
| 16 | No Bill | Jeffery Sampson | 22.10.2015 14:00:00 | 697920 |
| 17 | Bill | Jeffery Sampson | 22.10.2015 12:00:00 | 697920 |
| 18 | Bill | Jeffery Sampson | 24.10.2015 12:00:00 | 992196 |
| 19 | Active | Jeffery Sampson | 23.10.2015 14:00:00 | 992196 |
| 20 | In Progress | Jeffery Sampson | 23.10.2015 13:00:00 | 992196 |
| 21 | Active | Jeffery Sampson | 23.10.2015 12:00:00 | 992196 |
| 22 | Bill | Jeffery Sampson | 22.10.2015 12:00:00 | 992196 |
+----+-------------+-----------------+---------------------+----------------+
+----+---------+-----------+---------------------+----------------+
| Id | SMState | UpdatedBy | UpdatedOn | cd_ClaimNumber |
+----+---------+-----------+---------------------+----------------+
| 1 | Bill | John Doe | 25.10.2015 12:00:00 | 208692 |
| 2 | Bill | John Doe | 25.10.2015 12:00:00 | 297983 |
| 3 | Bill | John Doe | 25.10.2015 13:00:00 | 697920 |
| 4 | Bill | John Doe | 25.10.2015 12:00:00 | 992196 |
+----+---------+-----------+---------------------+----------------+
以下是使用上述数据时数据表的外观:
+----+-------------+-----------------+---------------------+----------------+
| Id | SMState | UpdatedBy | UpdatedOn | cd_ClaimNumber |
+----+-------------+-----------------+---------------------+----------------+
| 1 | No Bill | John Jones | 24.10.2015 13:00:00 | 208692 |
| 2 | Bill | John Jones | 24.10.2015 12:00:00 | 208692 |
| 3 | In Progress | John Jones | 23.10.2015 12:00:00 | 208692 |
| 4 | Active | John Jones | 22.10.2015 16:00:00 | 208692 |
| 5 | No Bill | John Jones | 22.10.2015 14:00:00 | 208692 |
| 6 | Bill | John Jones | 22.10.2015 12:00:00 | 208692 |
| 7 | Bill | John Jones | 24.10.2015 12:00:00 | 297983 |
| 8 | Active | John Jones | 23.10.2015 14:00:00 | 297983 |
| 9 | In Progress | John Jones | 23.10.2015 13:00:00 | 297983 |
| 10 | Active | John Jones | 23.10.2015 12:00:00 | 297983 |
| 11 | Bill | John Jones | 22.10.2015 12:00:00 | 297983 |
| 12 | No Bill | Jeffery Sampson | 24.10.2015 13:00:00 | 697920 |
| 13 | Bill | Jeffery Sampson | 24.10.2015 12:00:00 | 697920 |
| 14 | In Progress | Jeffery Sampson | 23.10.2015 12:00:00 | 697920 |
| 15 | Active | Jeffery Sampson | 22.10.2015 16:00:00 | 697920 |
| 16 | No Bill | Jeffery Sampson | 22.10.2015 14:00:00 | 697920 |
| 17 | Bill | Jeffery Sampson | 22.10.2015 12:00:00 | 697920 |
| 18 | Bill | Jeffery Sampson | 24.10.2015 12:00:00 | 992196 |
| 19 | Active | Jeffery Sampson | 23.10.2015 14:00:00 | 992196 |
| 20 | In Progress | Jeffery Sampson | 23.10.2015 13:00:00 | 992196 |
| 21 | Active | Jeffery Sampson | 23.10.2015 12:00:00 | 992196 |
| 22 | Bill | Jeffery Sampson | 22.10.2015 12:00:00 | 992196 |
+----+-------------+-----------------+---------------------+----------------+
+----+---------+-----------+---------------------+----------------+
| Id | SMState | UpdatedBy | UpdatedOn | cd_ClaimNumber |
+----+---------+-----------+---------------------+----------------+
| 1 | Bill | John Doe | 25.10.2015 12:00:00 | 208692 |
| 2 | Bill | John Doe | 25.10.2015 12:00:00 | 297983 |
| 3 | Bill | John Doe | 25.10.2015 13:00:00 | 697920 |
| 4 | Bill | John Doe | 25.10.2015 12:00:00 | 992196 |
+----+---------+-----------+---------------------+----------------+
我想要的最终结果是这样的:
+---------------+-----------+-----------------+---------------------+-------------+
| CurrentStatus | OldStatus | UpdatedBy | UpdateOn | ClaimNumber |
+---------------+-----------+-----------------+---------------------+-------------+
| No Bill | Bill | John Jones | 22.10.2015 14:00:00 | 208692 |
| In Progress | Active | John Jones | 23.10.2015 12:00:00 | 208692 |
| No Bill | Bill | John Jones | 24.10.2015 13:00:00 | 208692 |
| Active | Bill | John Jones | 23.10.2015 12:00:00 | 297983 |
| In Progress | Active | John Jones | 23.10.2015 13:00:00 | 297983 |
| No Bill | Bill | Jeffery Sampson | 22.10.2015 14:00:00 | 697920 |
| In Progress | Active | Jeffery Sampson | 23.10.2015 12:00:00 | 697920 |
| No Bill | Bill | Jeffery Sampson | 24.10.2015 13:00:00 | 697920 |
| Active | Bill | Jeffery Sampson | 23.10.2015 12:00:00 | 992196 |
| In Progress | Active | Jeffery Sampson | 23.10.2015 13:00:00 | 992196 |
+---------------+-----------+-----------------+---------------------+-------------+
以下是我尝试过的:
with Test_1 as
( select ROW_NUMBER() over(order by pdr.cd_ClaimNumber,pdr.UpdatedOn) as RowID,* from #TestingTable pdr)
select t1.cd_ClaimNumber,t1.UpdatedOn, t1.SMState OldStatus, t2.SMState NewStatus, t1.UpdatedBy
from Test_1 t1
join Test_1 t2 on t2.RowID = t1.RowID + 1
where t1.cd_ClaimNumber = t2.cd_ClaimNumber
and t1.SMState != t2.SMState
order by t1.cd_ClaimNumber,t2.UpdatedOn
这给了我一个结果:
+----------------+---------------------+-------------+-------------+-----------------+
| cd_ClaimNumber | UpdatedOn | OldStatus | NewStatus | UpdatedBy |
+----------------+---------------------+-------------+-------------+-----------------+
| 208692 | 22.10.2015 12:00:00 | Bill | No Bill | John Jones |
| 208692 | 22.10.2015 14:00:00 | No Bill | Active | John Jones |
| 208692 | 22.10.2015 16:00:00 | Active | In Progress | John Jones |
| 208692 | 23.10.2015 12:00:00 | In Progress | Bill | John Jones |
| 208692 | 24.10.2015 12:00:00 | Bill | No Bill | John Jones |
| 297983 | 22.10.2015 12:00:00 | Bill | Active | John Jones |
| 297983 | 23.10.2015 12:00:00 | Active | In Progress | John Jones |
| 297983 | 23.10.2015 13:00:00 | In Progress | Active | John Jones |
| 297983 | 23.10.2015 14:00:00 | Active | Bill | John Jones |
| 697920 | 22.10.2015 12:00:00 | Bill | No Bill | Jeffery Sampson |
| 697920 | 22.10.2015 14:00:00 | No Bill | Active | Jeffery Sampson |
| 697920 | 22.10.2015 16:00:00 | Active | In Progress | Jeffery Sampson |
| 697920 | 23.10.2015 12:00:00 | In Progress | Bill | Jeffery Sampson |
| 697920 | 24.10.2015 12:00:00 | Bill | No Bill | Jeffery Sampson |
| 992196 | 22.10.2015 12:00:00 | Bill | Active | Jeffery Sampson |
| 992196 | 23.10.2015 12:00:00 | Active | In Progress | Jeffery Sampson |
| 992196 | 23.10.2015 13:00:00 | In Progress | Active | Jeffery Sampson |
| 992196 | 23.10.2015 14:00:00 | Active | Bill | Jeffery Sampson |
+----------------+---------------------+-------------+-------------+-----------------+
这不太管用。它得到了所有的改变,不仅仅是我想要的。我是基于的,如果您的审计表中有适当的列,那么我认为它是一个非常简单的查询。当然,我希望claimnumber不会包括在这里,但会有一些原始数据的参考,然后它将是简单的连接。但根据审计表的结构,可能还有更多内容
SELECT old, new, who, when, claimnumber
FROM table
WHERE ( (old = 'Bill' AND new = 'Active')
OR (old = 'Bill' AND new = 'No Bill')
OR (old = 'Active' AND new = 'In Progress'))
AND user IN ('User1','User2','User3')
ORDER BY when
另一个故事是要有支持这个查询的索引
若审计表只包含一个包含主记录状态的字段,则这可能是另一个版本
create table audit ([status] nvarchar(20), [user] nvarchar(20), [date] date, [claimnumber] int)
insert into audit values
('Bill', 'User5', '2017-05-01', 001),
('Bill', 'User4', '2017-05-03', 005),
('Active', 'User2', '2017-05-05', 001),
('No Bill', 'User3', '2017-05-10', 005),
('In Progress', 'User1', '2017-05-08', 001)
SELECT * FROM (
SELECT LAG([status]) OVER (PARTITION BY [claimnumber] ORDER BY [claimnumber], [date]) as oldstatus, *
FROM audit
) AS A
WHERE [user] IN ('User1','User2','User3') AND
(([oldstatus]='Bill' AND [status] = 'Active')
OR ([oldstatus]='Bill' AND [status] = 'No Bill')
OR ([oldstatus]='Active' AND [status] = 'In Progress'))
ORDER BY [claimnumber], [date]
结果
oldstatus status user date claimnumber
Bill Active User2 05.05.2017 00:00:00 1
Active In Progress User1 08.05.2017 00:00:00 1
Bill No Bill User3 10.05.2017 00:00:00 5
样本数据和预期输出?您现在肯定知道我们需要一些细节来帮助。表定义、示例数据、所需输出。这甚至不是一个问题。这是一个很好的开始,使这合理。如果需要Sean的意大利面链接,这里也需要。对不起,我应该在发布之前花更多的时间准备。我正在使用rextester.com创建一个示例数据集。我会很快准备好的。请确保你也把问题本身所需的细节,为那些没有打开链接的人。