sql - 查找它们之间具有特定时间增量的行

标签 sql algorithm time

通常,我的任务是这样的:不同的操作有很多 ID 和时间戳。我需要在其中找到这些 ID 的位置

A1, A1, A2, A3, ..., 一个

存在Ai、Al、Am (1 <= i,l,m <= n),即1小时<=timediff(Ai, Al)<=1周和1小时<=timediff(Al, Am) <=1 周。 这里的 A 表示 Action 的时间。

特别是,我有数据(如下所示)并且只想找到以下陈述为真的那些 ID:相同的 ID,3 次操作之间至少间隔 1 小时,并且它们之间的间隔不超过 1 周。

ID      EventDate
6727    2014-12-12 09:41:02.0
17390   2014-12-12 10:06:03.0
18179   2014-11-12 10:18:08.0
18179   2014-12-12 11:17:36.0
18179   2014-12-12 12:17:45.0
18179   2014-12-12 12:17:56.0
262070  2014-11-12 11:30:00.0
262070  2014-11-12 11:33:26.0
262070  2014-12-12 11:33:26.0
262070  2014-12-12 10:17:19.0

例如,对于该示例,它可能是 18179(因为我可以在那里找到 3 个操作:10:06:03.0、11:17:36.0 和 12:17:56.0)但不是 262070(因为没有 3 个操作在日志中的 1 小时到 1 周内)。

有人可以帮助我以最方便的 SQL 方式完成此操作,但无需存储过程。

最佳答案

你试过这样的事情吗

SELECT Start.ID FROM 
Table AS Start
INNER JOIN Table AS Middle ON  Start.ID = Middle.ID AND DATEDIFF( hour, Start.EventDate,Middle.EventDate) > 1 AND DATEDIFF( week , Start.EventDate,Middle.EventDate) < 1
INNER JOIN Table AS End ON  Start.ID = Middle.ID AND DATEDIFF( hour, End .EventDate,Middle.EventDate) > 1 AND DATEDIFF( week , End .EventDate,Middle.EventDate) < 1
WHERE Start.ID IS NOT NULL AND Middle.ID IS NOT NULL AND End .ID IS NOT NULL

关于sql - 查找它们之间具有特定时间增量的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441806/

相关文章:

swift - 经过一定时间后触发 Xcode 通知 (Swift 3)

mysql - SQL TIME 更改数据库中的格式?

php - SQL inner join 将整数转换为文本

SQL 返回 2008 年第 13 周的结果(未分组)

SQL Server - 根据 ID 和计算机名查找以前的记录

sql - 如何从另一台服务器访问我的数据库

c++ - 为什么不是条件 *First1 == * First2 ?? (C++ STL包含函数实现)

algorithm - 合并两个二叉树

java - 将范围列表缩小为整数数组

python - 使用 Python 库或正则表达式将持续时间转换为数字分钟