sql - DATEDIFF 基于 WHERE 子句中的 ID

标签 sql sql-server-2012

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

  1. Calculate the time difference between EID of 33 and 49
  2. 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

但是仍然没有返回正确的数据。

这是一个示例记录。

enter image description here

根据此记录,它应该只返回 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/

相关文章:

SQL - 从 DateTime 字段中仅选择 'Year'

php - 插入无值

sql - 检查Where中的count函数

mysql - 从 mysql 迁移到 sql server

sql - SQL Server 2012 中的日期和时间格式转换

mysql - SQL 查询以区分大小写的行

SSIS包在SQL Server 2012中未以32位运行

sql - 什么叫KEY

php如何将评论sql链接到博客sql

java.sql.SQLException : Closed Resultset: next on selecting item from ComboBox 异常