SQL计数列值更改
在DBO[Warehouse_DB].[DBO].[WorkItemHistory]中使用SSMS 2016:SQL计数列值更改,sql,sql-server,Sql,Sql Server,在DBO[Warehouse_DB].[DBO].[WorkItemHistory]中使用SSMS 2016: 我试图在历史记录列(Owner_ID)中计算时间,它从不在我的组中的值更改为我的组中的值。我的群组是SAG或任何包含prometra的用户名 在下面的例子中(按时间顺序从最老到最新从Joe Schomoe开始),它将计数3。1.第一个凹陷,2。亚历克斯(普罗姆特拉),3岁。第二个凹陷。 Bill(Prometra)不算,因为之前的值是SAG,所以已经是我团队的一部分 TimeStamp
我试图在历史记录列(Owner_ID)中计算时间,它从不在我的组中的值更改为我的组中的值。我的群组是SAG或任何包含prometra的用户名 在下面的例子中(按时间顺序从最老到最新从Joe Schomoe开始),它将计数3。1.第一个凹陷,2。亚历克斯(普罗姆特拉),3岁。第二个凹陷。
Bill(Prometra)不算,因为之前的值是SAG,所以已经是我团队的一部分
TimeStamp Owner_ID
1:45 AM Joe Schmoe
2:45 AM SAG
3:36 AM Bill (Promtera)
7:15 AM Bill (Promtera)
8:56 AM SOR
11:30 AM Sal Smith
12:45 PM Alex (Promtera)
1:45 PM SOR
4:45 PM SAG`
由于您似乎正在使用SQL Server 2016,因此可以使用
LAG()
获取前一行的值,并与当前行进行比较:
CREATE TABLE Log ([TimeStamp] time, [Owner_ID] varchar(15)) ;
INSERT INTO Log
([TimeStamp], [Owner_ID])
VALUES
('1:45 AM', 'Joe Schmoe'),
('2:45 AM', 'SAG'),
('3:36 AM', 'Bill (Promtera)'),
('7:15 AM', 'Bill (Promtera)'),
('8:56 AM', 'SOR'),
('11:30 AM', 'Sal Smith'),
('12:45 PM', 'Alex (Promtera)'),
('1:45 PM', 'SOR'),
('4:45 PM', 'SAG');
with ProcesedLog as (
select Owner_ID,
lag(Owner_ID,1,Owner_ID) over(order by [TimeStamp]) as PreviousID
from Log
)
select sum(case when MyGroup!=PreviousMyGroup and MyGroup=1
then 1 else 0 end) as ChangesToMyGrpup
from (select
case when Owner_ID='SAG' or Owner_ID like '%(Promtera)%'
then 1 else 0 end as MyGroup,
case when PreviousID='SAG' or PreviousID like '%(Promtera)%'
then 1 else 0 end as PreviousMyGroup
from ProcesedLog)
as MyGroups
我不遵循您的逻辑,但我立即发现了一个问题,因为您从未指定使用哪个列来确定什么是“第一”或“第二”;如果你设想一个订单,你必须有一个列来提供它。(1)你需要一个列来指定订单。SQL表表示无序集。(2) 标记一个数据库——可能是SQL Server 2016。编辑以处理注释