在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`
答案 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