SQL Count列值更改

时间:2017-09-07 16:44:54

标签: sql sql-server

在DBO [Warehouse_DB]中使用SSMS 2016。[dbo]。[WorkItemHistory]:
我正在尝试计算历史记录列(Owner_ID)中的时间,它从不在我的组中的值更改为我的组中的值。我的群组 SAG 或包含 Promtera 的任何用户名。

在下面的案例中(从Joe Schomoe开始按时间顺序从最早到最新排序),它将计算 3 。 1.第一个SAG,2。Alex(Promtera),3。第二个SAG Bill(Promtera)不会计算,因为之前的值是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`

1 个答案:

答案 0 :(得分:0)

由于您似乎在使用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

SQL Fiddle