gpt4 book ai didi

sql - 在表中查找缺失的时间间隔

转载 作者:行者123 更新时间:2023-12-04 14:48:21 24 4
gpt4 key购买 nike

我有下表,其中包含每 15 分钟从几个不同设备读取的值:

ID   DeviceID   Date                    Value
----------------------------------------------
1 3 24.08.2011 00:00:00 0.51
2 3 24.08.2011 00:15:00 2.9
3 3 24.08.2011 00:30:00 0
4 3 24.08.2011 00:45:00 7.1
5 3 24.08.2011 01:00:00 1.05
6 3 24.08.2011 03:15:00 3.8

对于给定的月份,我想在没有条目的每个设备的表中找到所有空白。对于上表,结果应该是这样的:
DeviceID    StartDate               EndDate
-------------------------------------------------------
3 24.08.2011 01:00:00 24.08.2011 03:15:00

该表大约有 35000 个设备和 1 亿个条目。

这是我尝试过的;它相当慢,但返回了我需要的东西。然而,除了它的速度之外,还有另一个问题:它只能找到给定月份设备的最后一个条目的缺失间隔;之后的任何内容都将被忽略,因此可能会错过额外的缺失值区间。
SELECT
t2.Date AS StartDate
, t1.Date AS EndDate
FROM
TestTable t1
INNER JOIN TestTable t2 ON t1.DeviceID = t2.DeviceID
WHERE
(t2.Date = (SELECT MAX(Date) FROM TestTable t3 WHERE t3.Date < t1.Date AND t3.DeviceID = t1.DeviceID)
AND DATEDIFF(MINUTE, t2.Date, t1.Date) > 15)
AND t1.DeviceID = @id
AND DATEPART(YEAR, t1.Date) = @year AND DATEPART(MONTH, t1.Date) = @month

最佳答案

以下应该可以工作,并且不会只返回一个 deviceid 的单个记录。

这样做的要点是

  • 为每条记录添加一个行号,按 Date 排序并为每个 DeviceID 重新启动.
  • 与 self 连接以创建由两个原始行组合组成的行的结果。每行的列之间的关系是行号(+1)和DeviceID .
  • 只保留相关 Date 的那些行超过15分钟。

  • SQL 语句
    ;WITH t AS (
    SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
    FROM TestTable
    )
    SELECT t1.DeviceID, t1.Date, t2.Date
    FROM t t1
    INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
    WHERE DATEDIFF(MINUTE, t1.Date, t2.Date) > 15

    测试脚本
    ;WITH TestTable (ID, DeviceID, Date, Value) AS (
    SELECT 1, 3, '2011-08-24 00:00:00', 0.51 UNION ALL
    SELECT 2, 3, '2011-08-24 00:15:00', 2.9 UNION ALL
    SELECT 3, 3, '2011-08-24 00:30:00', 0 UNION ALL
    SELECT 4, 3, '2011-08-24 00:45:00', 7.1 UNION ALL
    SELECT 5, 3, '2011-08-24 01:00:00', 1.05 UNION ALL
    SELECT 6, 3, '2011-08-24 03:15:00', 3.8
    )
    , t AS (
    SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
    FROM TestTable
    )
    SELECT t1.DeviceID, t1.Date, t2.Date
    FROM t t1
    INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
    WHERE DATEDIFF(MINUTE, t1.Date, t2.Date) > 15

    关于sql - 在表中查找缺失的时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10909015/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com