Sql server 2012 比较时差的SQL查询

Sql server 2012 比较时差的SQL查询,sql-server-2012,Sql Server 2012,我使用了下面的代码进行查询,并得到了显示的输出。现在,我想查询如下所述。我该怎么做 查找代码2,检查同一ItemID中代码1是否在代码2之后。如果是,比较时差。如果时间差小于10秒,则显示两个比较的行 预期结果 Date Code ItemName ItemID 2017-01-06 11:00:49.000 2 B 98 2017-01-06 11:00:49.000 1 A 98 dbfiddle

我使用了下面的代码进行查询,并得到了显示的输出。现在,我想查询如下所述。我该怎么做

查找代码2,检查同一ItemID中代码1是否在代码2之后。如果是,比较时差。如果时间差小于10秒,则显示两个比较的行

预期结果

         Date           Code  ItemName  ItemID  
2017-01-06 11:00:49.000  2       B      98
2017-01-06 11:00:49.000  1       A      98

dbfiddle

是的,从结果中。第一条记录应该是代码2?@McNets添加了预期的result@Djuka不可以。它可以是1,有时记录可以有代码2,然后又有代码2。所以,我需要检查代码1是否在代码2之后。在ItemID=98的输出中,您有10多条记录。它应该只有2条记录?比较必须在同一个ItemId内。因此,2017年1月6日20:24:55 | 2 | B | 98也应该被取消。此外,ItemId 99仍在显示超过10秒的数据。请澄清您的问题,哪些行不应返回?因为2017-01-06 20:24:55.000 2 B 98和2017-03-14 16:37:42.000 2 B 99,第二个有另一个项目我很抱歉。我没有解释清楚。检查我的输出和预期结果。比较必须在同一个ItemId内进行。当我对数据使用此查询时,我意识到某些具有不同ItemId的数据会进行比较。如果您可以发布更改,我将进行查看。
         Date           Code  ItemName  ItemID  
2017-01-06 11:00:49.000  2       B      98
2017-01-06 11:00:49.000  1       A      98
2017-01-06 11:00:55.000  2       B      98
2017-01-06 12:01:56.000  1       A      98
2017-01-06 12:02:37.000  2       B      98
2017-01-06 12:03:49.000  1       A      98
2017-01-06 12:05:44.000  2       B      98
2017-01-06 20:24:32.000  1       A      98
2017-01-06 20:24:55.000  2       B      98
2017-03-14 16:37:42.000  2       B      99
2017-03-14 17:40:24.000  1       A      99
2017-03-14 17:40:25.000  2       B      99
2017-03-14 21:28:46.000  1       A      99
2017-03-15 08:03:07.000  2       B      99
2017-03-15 10:43:00.000  1       A      99
2017-03-15 12:01:17.000  2       B      99
2017-03-15 14:18:19.000  2       B      99
         Date           Code  ItemName  ItemID  
2017-01-06 11:00:49.000  2       B      98
2017-01-06 11:00:49.000  1       A      98
create table results ([Date] datetime, Code int, ItemName char(1), ItemID int);
insert into results values
('2017-01-06 11:00:49',  2,       'B',      98),
('2017-01-06 11:00:49',  1,       'A',      98),
('2017-01-06 11:00:55',  2,       'B',      98),
('2017-01-06 12:01:56',  1,       'A',      98),
('2017-01-06 12:01:58',  1,       'A',      98),
('2017-01-06 12:02:37',  2,       'B',      98),
('2017-01-06 12:03:49',  1,       'A',      98),
('2017-01-06 12:05:44',  2,       'B',      98),
('2017-01-06 20:24:32',  1,       'A',      98),
('2017-01-06 20:24:55',  2,       'B',      98),
('2017-03-07 00:02:27',  1,       'A',      91),
('2017-03-07 00:02:27',  1,       'A',      58),
('2017-03-14 16:37:42',  2,       'B',      99),
('2017-03-14 17:40:24',  1,       'A',      99),
('2017-03-14 17:40:38',  2,       'B',      99),
('2017-03-14 21:28:46',  1,       'A',      99),
('2017-03-15 08:03:07',  2,       'B',      99),
('2017-03-15 10:43:00',  1,       'A',      99),
('2017-03-15 12:01:17',  2,       'B',      99),
('2017-03-15 14:18:19',  1,       'A',      99);
--= set a reset point when ItemId changes, or there is no correlative (2,1) couples
--= keep in mind this solution assumes that first Code must be 2
--
WITH SetReset AS
(
    SELECT [Date], Code, ItemName, ItemId,
           CASE WHEN LAG([ItemId]) OVER (PARTITION BY ItemId ORDER BY [Date]) IS NULL
                     OR ([Code] = 2)
                     OR ([Code] = COALESCE(LAG([Code]) OVER (PARTITION BY ItemId ORDER BY [Date]), [Code]))
                THEN 1 END is_reset
    FROM   results

)
--
--= set groups according to reset points
--
, SetGroup AS
   (
        SELECT [Date], Code, ItemName, ItemId,
               COUNT(is_reset) OVER (ORDER BY [ItemId], [Date]) grp
        FROM   SetReset
    )
    --
    --= calcs diff date for each group 
    , CalcSeconds AS
    (
        SELECT [Date], Code, ItemName, ItemId,
               DATEDIFF(SECOND, MIN([Date]) OVER (PARTITION BY grp), MAX([Date]) OVER (PARTITION BY grp)) dif_sec,
               COUNT(*) OVER (PARTITION BY grp) num_items
        FROM   SetGroup
    )
    --
    --= selects those rows with 2 items by group and date diff less than 10 sec
    SELECT [Date], Code, ItemName, ItemId
    FROM   CalcSeconds
    WHERE  dif_sec < 10 
    AND    num_items = 2
;
GO
Date | Code | ItemName | ItemId :------------------ | ---: | :------- | -----: 06/01/2017 11:00:49 | 2 | B | 98 06/01/2017 11:00:49 | 1 | A | 98 Warning: Null value is eliminated by an aggregate or other SET operation.