我尝试根据以下条件从查询中排除行。
- Calculate the time difference between EID of 33 and 49
- If the total seconds is less than 35 exclude them from query
SELECT c1.* FROM CTE2 C2
INNER JOIN CTE C1
ON C2.ID = C1.ID
AND c1.EID IN (33,49)
ORDER BY C1.ID, C1.DateTime
我的数据可能包含具有重复 EID=33
的同一 ID 的多行,但始终只有一个 EID=49
。因此,我对 ID 的最后一条记录
减去同一 ID 的上一条
行感兴趣。如果少于 35
秒,请从结果中排除此 ID
。
我尝试使用 Lag
函数并向上面的查询添加 AND
语句
AND DATEDIFF(SECOND, DateTime, LAG(datetime) OVER (ORDER BY id, datetime)) < 35
但我收到以下错误:
Windowed functions can only appear in the SELECT or ORDER BY clauses.
我确实尝试了不同的方法:
;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
但是仍然没有返回正确的数据。
这是一个示例记录。
根据此记录,它应该只返回 ID=12345
并排除 ID=54321
,因为差异仅为 12 秒。
有什么建议吗?
更新
我无法创建 SQLFIDDLE。这是创建 TEMP 表的脚本。
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 )
最佳答案
仅使用聚合怎么样?假设 33 始终在 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;
关于sql - DATEDIFF 基于 WHERE 子句中的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465495/