【问题标题】:SQL Query for retrieving records having the same ID and Type but only separated by 3 minutes apart用于检索具有相同 ID 和类型但仅相隔 3 分钟的记录的 SQL 查询
【发布时间】:2021-12-22 08:25:38
【问题描述】:

我正在尝试编写一个查询以从如下所示的表中检索 ID:

ID TYPE CREATED_TIME
1234 start 2021-11-01 21:43:48.0000000
1234 start 2021-11-01 21:44:40.0000000
1234 end 2021-11-04 15:27:50.0000000
4567 start 2021-09-02 20:12:40.0000000
4567 start 2021-09-02 23:01:11.0000000

理想情况下,我希望查询返回具有 2 个或更多相同类型记录且创建时间不到 3 分钟的 ID分开。所以它应该返回 ID 1234,因为它有 2 条记录类型 = start 并且创建时间相隔不到 1 分钟。 它不应返回 4567,因为创建时间相隔 3 小时。

【问题讨论】:

  • 不知道你的流程,但是这个场景呢:ID 3456 Start at 21:00:00 and End at 21:01:00... 然后 Start at 21:02:00并在 21:05:00 结束?在这种情况下,ID 有两个开始,但第一个应该由第一个结束事件结束...
  • @Tyron78 类型可以是任何类型,不需要在另一个开始之前结束。希望这对你有意义。谢谢:)
  • 在您给出的示例中,您只想要“1234”的结果....不需要其他详细信息?
  • @GrahamH 是的,我只希望查询返回“1234”。

标签: sql sql-server database datetime


【解决方案1】:

假设您的表被称为 DATA 这应该可以工作:

SELECT DISTINCT t1.ID
FROM 
    DATA t1 JOIN
    DATA t2 ON t1.ID = t2.ID 
    AND t1.TYPE = t2.TYPE 
    AND t1.CREATED_TIME <> t2.CREATED_TIME 
    AND (ABS(DATEDIFF(MINUTE, t1.CREATED_TIME, t2.CREATED_TIME))  < 3)

【讨论】:

  • 谢谢,它有效:)
【解决方案2】:

自联接效率低。您应该为此使用窗口函数

SELECT ID
FROM (
    SELECT *,
      PrevVal = LAG(CREATED_TIME, 1, '19000101') OVER (PARTITION BY ID, Type ORDER BY CREATED_TIME)
    FROM YourTable t
) t
WHERE DATEADD(minute, 3, t.PrevVal) >= t.CREATED_TIME
GROUP BY ID;

db<>fiddle

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2023-04-03
    相关资源
    最近更新 更多