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
,但它将始终包含一行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
)