SQL 标记行在上一个标记后 2 小时出现

SQL Flag Rows Occurring 2 Hours After Previous Flag

由于天线过于敏感,我有一些杂乱的 RFID 数据。有一个物理过程可以跟踪 RFID 标签在一个周期内移动通过不同的站点。带有 RFID 标签的物品每天可以在循环中移动多次,但它极不可能在第一次读取后的两小时内开始循环 window。

我正在尝试创建一个标志列以确定某个项目的新周期何时开始,或者return一个项目经历了一个周期的次数的计数。

这是一些示例数据:

CREATE TABLE [dbo].[samplerfiddata](
    [Item] [nvarchar](50) NOT NULL,
    [Station_Type] [nvarchar](50) NOT NULL,
    [Station_Name] [nvarchar](50) NOT NULL,
    [Timestamp] [datetime2](7) NOT NULL,
    [Trying_to_Create_this_Flag_Column] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Decontamination', N'Decontamination', CAST(N'2020-10-10T06:30:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Decontamination', N'Decontamination', CAST(N'2020-10-11T14:30:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Washer', N'Washer', CAST(N'2020-10-11T14:45:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Decontamination', N'Decontamination', CAST(N'2020-10-11T15:15:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Other', N'Decontamination', CAST(N'2020-10-11T23:30:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Washer', N'Washer', CAST(N'2020-10-12T00:15:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Other', N'Decontamination', CAST(N'2020-10-12T00:45:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Other', N'Decontamination', CAST(N'2020-10-13T16:00:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Other', N'Decontamination', CAST(N'2020-10-13T16:30:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'A', N'Decontamination', N'Decontamination', CAST(N'2020-10-14T13:30:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Other', N'Decontamination', CAST(N'2020-10-12T08:30:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Decontamination', N'Decontamination', CAST(N'2020-10-12T14:30:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Washer', N'Washer', CAST(N'2020-10-12T14:45:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Decontamination', N'Decontamination', CAST(N'2020-10-12T15:15:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Decontamination', N'Decontamination', CAST(N'2020-10-12T18:00:00.0000000' AS DateTime2), N'1')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Washer', N'Washer', CAST(N'2020-10-13T18:15:00.0000000' AS DateTime2), N'0')
GO
INSERT [dbo].[RFID SQL Problem Sample Data] ([Item], [Station_Type], [Station_Name], [Timestamp], [Trying_to_Create_this_Flag_Column]) VALUES (N'B', N'Decontamination', N'Decontamination', CAST(N'2020-10-13T19:00:00.0000000' AS DateTime2), N'1')
GO

在这个数据中,我们有两个不同的项目在捕获所有场景的周期中移动。新周期的业务逻辑定义为当一个项目被 RFID 天线(站)读取时,其中站类型 = 去污或站名称 = 去污并且自上次第一次读取周期以来已经超过两个小时.

Item | Station_Type    | Station_Name    | Timestamp                   | Trying_to_Create_this_Flag_Column
:--- | :-------------- | :-------------- | :-------------------------- | :--------------------------------
A    | Decontamination | Decontamination | 2020-10-10 06:30:00.0000000 | 1                                
A    | Decontamination | Decontamination | 2020-10-11 14:30:00.0000000 | 1                                
A    | Washer          | Washer          | 2020-10-11 14:45:00.0000000 | 0                                
A    | Decontamination | Decontamination | 2020-10-11 15:15:00.0000000 | 0                                
A    | Other           | Decontamination | 2020-10-11 23:30:00.0000000 | 1                                
A    | Washer          | Washer          | 2020-10-12 00:15:00.0000000 | 0                                
A    | Other           | Decontamination | 2020-10-12 00:45:00.0000000 | 0                                
A    | Other           | Decontamination | 2020-10-13 16:00:00.0000000 | 1                                
A    | Other           | Decontamination | 2020-10-13 16:30:00.0000000 | 0                                
A    | Decontamination | Decontamination | 2020-10-14 13:30:00.0000000 | 1                                
B    | Other           | Decontamination | 2020-10-12 08:30:00.0000000 | 1                                
B    | Decontamination | Decontamination | 2020-10-12 14:30:00.0000000 | 1                                
B    | Washer          | Washer          | 2020-10-12 14:45:00.0000000 | 0                                
B    | Decontamination | Decontamination | 2020-10-12 15:15:00.0000000 | 0                                
B    | Decontamination | Decontamination | 2020-10-12 18:00:00.0000000 | 1                                
B    | Washer          | Washer          | 2020-10-13 18:15:00.0000000 | 0                                
B    | Decontamination | Decontamination | 2020-10-13 19:00:00.0000000 | 1                                

最终,我试图 return 一个如下所示的结果集:

item | cycles
:--- | -----:
A    |      5
B    |      4

这怎么可能完成?

如果我没听错,你需要递归查询:

with 
    data as (
        select item, station_type, station_name, timestamp, 
            row_number() over(partition by item order by timestamp) rn
        from samplerfiddata sf
    ),
    cte as (
        select d.*, timestamp first_timestamp 
        from data d 
        where rn = 1
        union all
        select d.*, 
            case when 'Decontamination' in (d.station_type, d.station_name) and d.timestamp > dateadd(hour, 2, c.first_timestamp)
                then d.timestamp
                else c.timestamp
            end
        from cte c
        inner join data d on d.item = c.item and d.rn = c.rn + 1
    )
select *
from cte
order by item, timestamp

想法是迭代遍历每个 item 的数据集,同时跟踪最后一个循环开始(此处别名为 first_timestamp);当遇到比前一个晚两个多小时的“净化”事件时,循环时间戳将重置。

您可以通过在外部查询中使用聚合来获取循环计数,例如:

select item, count(*) cnt_cycles
from cte
where timestamp = first_timestamp
group by item

Demo on DB Fiddle

试试这个,

with CTE as
(
select * ,
lead([Timestamp])over(partition by [Item] order by[Timestamp])lagtime
from [dbo].[samplerfiddata]
where Station_Type='Decontamination' or Station_Name='Decontamination'
)

select item
,sum(case when lagtime is null then 1
when datediff(MINUTE,[Timestamp],lagtime)>=60 then 1 else 0 end) as cycles

from CTE
group by item