Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DATEDIFF基于WHERE子句中的ID_Sql_Sql Server 2012 - Fatal编程技术网

Sql DATEDIFF基于WHERE子句中的ID

Sql DATEDIFF基于WHERE子句中的ID,sql,sql-server-2012,Sql,Sql Server 2012,我试图根据以下条件从查询中排除行 计算EID值33和49之间的时间差 如果总秒数小于35秒,则将其从查询中排除 “我的数据”可能包含同一ID的多行,其中包含重复的EID=33,但它将始终包含一行EID=49。因此,我对相同ID的ID减去上一行的最后一条记录感兴趣。如果小于35秒,则从结果中排除此ID 我尝试过使用Lag函数,并在上面的查询中添加和语句 AND DATEDIFF(SECOND, DateTime, LAG(datetime) OVER (ORDER BY id, datetime)

我试图根据以下条件从查询中排除行

  • 计算EID值33和49之间的时间差
  • 如果总秒数小于35秒,则将其从查询中排除
  • “我的数据”可能包含同一ID的多行,其中包含重复的
    EID=33
    ,但它将始终包含一行
    EID=49
    。因此,我对相同ID的ID减去上一行的
    最后一条记录
    感兴趣。如果小于
    35秒,则从结果中排除此
    ID

    我尝试过使用
    Lag
    函数,并在上面的查询中添加
    语句

    AND DATEDIFF(SECOND, DateTime, LAG(datetime) OVER (ORDER BY id, datetime)) < 35
    

    仅仅使用聚合如何?假设33总是在49之前(根据样本数据,情况似乎是这样):

    选择id
    来自@cte
    按id分组
    具有datediff(秒,
    最大值(eid=33,然后是日期时间结束时的情况),
    最大值(eid=49时的情况,然后是日期时间结束)
    ) < 35;
    
    使用条件聚合和中的

    WITH Cte AS(
        SELECT
            ID,
            MAX33 = MAX(CASE WHEN EID = 33 THEN DateTime END),
            MAX49 = MAX(CASE WHEN EID = 49 THEN DateTime END)
        FROM @cte
        WHERE EID IN(33, 49)
        GROUP BY ID
    )
    SELECT * 
    FROM @cte
    WHERE ID IN(
        SELECT ID
        FROM Cte
        WHERE ABS(DATEDIFF(SECOND, MAX33, MAX49)) >= 35
    )
    

    请为我们制作一把小提琴。谢谢,我一直都这么做,我也试过了,但网站根本没有响应。我明白了。只需将
    CREATE
    INSERT
    脚本粘贴为问题的一部分。添加临时表的脚本。谢谢!这就是我要找的。
    datediff
    中唯一的一个参数应该是
    second
    而不是
    seconds
    ;with cte AS 
    (
       SELECT *,ROW_NUMBER() OVER(PARTITION BY id ORDER BY DateTime) AS RN 
       FROM @cte WHERE eid IN (33,49)
    )
    SELECT a.*, DATEDIFF(SECOND,a.datetime, b.DateTime) AS diff
    FROM cte a
    LEFT JOIN cte b
    ON a.id = b.id
    AND a.RN = b.RN -1
    AND DATEDIFF(second, a.DateTime, b.DateTime) < 35
    
    DECLARE @cte as table 
    (
       ID Char (5),
       [DateTime]  DateTime,
       EID integer
    )
    
    INSERT INTO @cte
    VALUES
    ( N'12345', N'2016-03-15 13:14:57.000', 1 ), 
    ( N'12345', N'2016-03-15 13:15:01.000', 2 ), 
    ( N'12345', N'2016-03-15 13:15:12.000', 5 ), 
    ( N'12345', N'2016-03-15 13:15:13.000', 12 ), 
    ( N'12345', N'2016-03-15 13:15:13.000', 13 ), 
    ( N'12345', N'2016-03-15 13:15:27.000', 16 ), 
    ( N'12345', N'2016-03-15 13:15:27.000', 22 ), 
    ( N'12345', N'2016-03-15 13:15:27.000', 23 ), 
    ( N'12345', N'2016-03-15 13:15:39.000', 26 ), 
    ( N'12345', N'2016-03-15 13:15:39.000', 32 ), 
    ( N'12345', N'2016-03-15 13:15:42.000', 52 ), 
    ( N'12345', N'2016-03-15 13:15:42.000', 33 ), 
    ( N'12345', N'2016-03-15 13:15:52.000', 48 ), 
    ( N'12345', N'2016-03-15 13:16:37.000', 33 ), 
    ( N'12345', N'2016-03-15 13:17:13.000', 35 ), 
    ( N'12345', N'2016-03-15 13:17:13.000', 49 ), 
    ( N'54321', N'2016-03-24 20:55:30.000', 1 ), 
    ( N'54321', N'2016-03-24 20:55:30.000', 50 ),  
    ( N'54321', N'2016-03-24 20:55:32.000', 2 ), 
    ( N'54321', N'2016-03-24 20:56:30.000', 5 ), 
    ( N'54321', N'2016-03-24 20:56:30.000', 12 ), 
    ( N'54321', N'2016-03-24 20:56:30.000', 13 ), 
    ( N'54321', N'2016-03-24 20:57:44.000', 16 ), 
    ( N'54321', N'2016-03-24 20:57:44.000', 22 ), 
    ( N'54321', N'2016-03-24 20:57:44.000', 23 ), 
    ( N'54321', N'2016-03-24 20:57:56.000', 26 ), 
    ( N'54321', N'2016-03-24 20:57:56.000', 32 ), 
    ( N'54321', N'2016-03-24 20:57:59.000', 52 ), 
    ( N'54321', N'2016-03-24 20:58:54.000', 33 ), 
    ( N'54321', N'2016-03-24 20:59:06.000', 35 ), 
    ( N'54321', N'2016-03-24 20:59:06.000', 49 )
    
    select id
    from @cte
    group by id
    having datediff(second,
                    max(case when eid = 33 then datetime end),
                    max(case when eid = 49 then datetime end)
                   ) < 35;
    
    WITH Cte AS(
        SELECT
            ID,
            MAX33 = MAX(CASE WHEN EID = 33 THEN DateTime END),
            MAX49 = MAX(CASE WHEN EID = 49 THEN DateTime END)
        FROM @cte
        WHERE EID IN(33, 49)
        GROUP BY ID
    )
    SELECT * 
    FROM @cte
    WHERE ID IN(
        SELECT ID
        FROM Cte
        WHERE ABS(DATEDIFF(SECOND, MAX33, MAX49)) >= 35
    )