数据之间的时间间隔都超过5分钟时,如何按计数查询和排序数据

约旦

我想查询其数据源的数据列表,如下所示:

ID       EVENT      TIME
--------------------------
A       EVENT_1     2019-05-07 18:26:39.000
B       EVENT_1     2019-05-07 18:31:39.000 
C       EVENT_3     2019-05-07 18:32:39.000
A       EVENT_2     2019-05-07 18:32:39.000
A       EVENT_2     2019-05-07 18:33:39.000
A       EVENT_1     2019-05-07 18:34:39.000
B       EVENT_2     2019-05-07 18:35:39.000
B       EVENT_1     2019-05-07 18:36:39.000
C       EVENT_2     2019-05-07 18:38:39.000
A       EVENT_1     2019-05-07 18:40:39.000
--------------------------

首先,只选择5分钟内相同ID的数据再次触发时最早的数据(不管它是什么事件)

所以,数据应该变成这样:

ID       EVENT      TIME
--------------------------
A       EVENT_1     2019-05-07 18:26:39.000
B       EVENT_1     2019-05-07 18:31:39.000 
C       EVENT_3     2019-05-07 18:32:39.000
A       EVENT_2     2019-05-07 18:32:39.000
C       EVENT_2     2019-05-07 18:38:39.000
A       EVENT_1     2019-05-07 18:40:39.000
--------------------------

谢谢,我正在使用 SQL Server 2016

埃兹洛

不像看起来那么简单,递归 CTE 可以通过 ID 以 1 对 1 的方式合并最接近的记录。

设置:

IF OBJECT_ID('tempdb..#EventData') IS NOT NULL
    DROP TABLE #EventData

CREATE TABLE #EventData (
    RowID INT IDENTITY,
    ID CHAR,
    Event VARCHAR(100),
    Time DATETIME)

INSERT INTO #EventData (
    ID,
    Event,
    Time)
VALUES
    ('A',' EVENT_1','2019-05-07 18:26:39.000'), 
    ('B',' EVENT_1','2019-05-07 18:31:39.000 '), 
    ('C',' EVENT_3','2019-05-07 18:32:39.000'), 
    ('A',' EVENT_2','2019-05-07 18:32:39.000'), 
    ('A',' EVENT_2','2019-05-07 18:33:39.000'), 
    ('A',' EVENT_1','2019-05-07 18:34:39.000'), 
    ('B',' EVENT_2','2019-05-07 18:35:39.000'), 
    ('B',' EVENT_1','2019-05-07 18:36:39.000'), 
    ('C',' EVENT_2','2019-05-07 18:38:39.000'), 
    ('A',' EVENT_1','2019-05-07 18:40:39.000')

解决方案:

;WITH EarliestRecordByID AS
(
    SELECT
        E.ID,
        MinTime = MIN(E.Time)
    FROM
        #EventData AS E
    GROUP BY
        E.ID
),
EventDataWithClosestRecord AS
(
    SELECT
        E.RowID,
        E.ID,
        E.Event,
        E.Time,
        ClosestRowID = T.RowID
    FROM
        #EventData AS E
        OUTER APPLY (
            SELECT TOP 1
                C.RowID
            FROM
                #EventData AS C
            WHERE
                C.ID = E.ID AND
                C.Time > DATEADD(MINUTE, 5, E.Time)
            ORDER BY
                C.Time) AS T
),
RecursiveCTE AS
(
    SELECT
        E.ID,
        E.RowID,
        E.Event,
        E.Time,
        E.ClosestRowID
    FROM
        EventDataWithClosestRecord AS E
        INNER JOIN EarliestRecordByID AS M ON 
            E.ID = M.ID AND
            E.Time = M.MinTime

    UNION ALL

    SELECT
        R.ID,
        D.RowID,
        D.Event,
        D.Time,
        D.ClosestRowID
    FROM
        RecursiveCTE AS R
        INNER JOIN EventDataWithClosestRecord AS D ON R.ClosestRowID = D.RowID
)
SELECT
    R.ID,
    R.RowID,
    R.Event,
    R.Time
FROM
    RecursiveCTE AS R
ORDER BY
    R.Time
OPTION
    (MAXRECURSION 1000) -- Your max recursion level here (0 for unlimited)

结果:

ID  RowID   Event       Time
A   1       EVENT_1     2019-05-07 18:26:39.000
B   2       EVENT_1     2019-05-07 18:31:39.000
C   3       EVENT_3     2019-05-07 18:32:39.000
A   4       EVENT_2     2019-05-07 18:32:39.000
C   9       EVENT_2     2019-05-07 18:38:39.000
A   10      EVENT_1     2019-05-07 18:40:39.000

可能还有另一种(可能更快)使用窗口函数的解决方案,因为与非递归解决方案相比,SQL Server 中的递归解决方案的性能非常差。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

按日期对15分钟间隔的数据进行计数

来自分类Dev

MySQL / Postgres查询5分钟间隔数据

来自分类Dev

如何在5分钟到30分钟之间汇总数据,同时保持日期间隔和其他值

来自分类Dev

在mysql中的开始时间和结束时间之间获取30分钟的间隔数据

来自分类Dev

在Excel中,如何计算大量的时间戳,并在5分钟内按周几排序计数?

来自分类Dev

如何使用不完整的数据集创建5分钟间隔的日期时间索引(Python)

来自分类Dev

如何使用不完整的数据集创建5分钟间隔的日期时间索引(Python)

来自分类Dev

以10分钟的间隔连接和绘制具有不同时间的数据

来自分类Dev

熊猫:如何将10分钟间隔的时间序列转换为数据帧?

来自分类Dev

如何将数据库记录分组为15分钟的时间间隔

来自分类Dev

如果行之间的差异超过1分钟,如何对数据进行分组

来自分类Dev

数据库中最近24小时的5分钟间隔聚合

来自分类Dev

如何显示同一用户之间间隔不超过2分钟的事件?

来自分类Dev

根据R中的分钟数据创建15分钟的时间间隔

来自分类Dev

如何增加5小时30分钟的时间?

来自分类Dev

RRDtool的设置间隔为5分钟,但每30分钟发送一次数据吗?

来自分类Dev

如何分别将时间列分为5分钟间隔和最大值/最小值SQL?

来自分类Dev

Python熊猫-根据数据间隔的长度,平均测量10分钟,得出15分钟平均值和60分钟平均值

来自分类Dev

在R中以5分钟的时间间隔创建一个24小时向量

来自分类Dev

如何进行查询以显示时间不超过30分钟的记录

来自分类Dev

爪哇 - 创建的时间(15分钟)的时间间隔的当前时间和未来的设定时间之间的阵列

来自分类Dev

删除时间戳记超过5分钟的记录

来自分类Dev

删除时间戳记超过5分钟的记录

来自分类Dev

在Lua中将时间间隔为5分钟

来自分类Dev

如何基于熊猫时间序列中的5分钟间隔创建组ID?

来自分类Dev

如何在Python中将1分钟的开-高-低-关数据转换为另一个时间范围(fx:5分钟1小时)?

来自分类Dev

如何计算以每个日期的持续时间和15分钟的间隔记录的用户

来自分类Dev

如何在SQL中将5分钟的时间戳间隔转换为1分钟的间隔,同时保留其他信息?

来自分类Dev

PHP和MySQL:从数据库中选择未刷新超过2分钟的帐户

Related 相关文章

  1. 1

    按日期对15分钟间隔的数据进行计数

  2. 2

    MySQL / Postgres查询5分钟间隔数据

  3. 3

    如何在5分钟到30分钟之间汇总数据,同时保持日期间隔和其他值

  4. 4

    在mysql中的开始时间和结束时间之间获取30分钟的间隔数据

  5. 5

    在Excel中,如何计算大量的时间戳,并在5分钟内按周几排序计数?

  6. 6

    如何使用不完整的数据集创建5分钟间隔的日期时间索引(Python)

  7. 7

    如何使用不完整的数据集创建5分钟间隔的日期时间索引(Python)

  8. 8

    以10分钟的间隔连接和绘制具有不同时间的数据

  9. 9

    熊猫:如何将10分钟间隔的时间序列转换为数据帧?

  10. 10

    如何将数据库记录分组为15分钟的时间间隔

  11. 11

    如果行之间的差异超过1分钟,如何对数据进行分组

  12. 12

    数据库中最近24小时的5分钟间隔聚合

  13. 13

    如何显示同一用户之间间隔不超过2分钟的事件?

  14. 14

    根据R中的分钟数据创建15分钟的时间间隔

  15. 15

    如何增加5小时30分钟的时间?

  16. 16

    RRDtool的设置间隔为5分钟,但每30分钟发送一次数据吗?

  17. 17

    如何分别将时间列分为5分钟间隔和最大值/最小值SQL?

  18. 18

    Python熊猫-根据数据间隔的长度,平均测量10分钟,得出15分钟平均值和60分钟平均值

  19. 19

    在R中以5分钟的时间间隔创建一个24小时向量

  20. 20

    如何进行查询以显示时间不超过30分钟的记录

  21. 21

    爪哇 - 创建的时间(15分钟)的时间间隔的当前时间和未来的设定时间之间的阵列

  22. 22

    删除时间戳记超过5分钟的记录

  23. 23

    删除时间戳记超过5分钟的记录

  24. 24

    在Lua中将时间间隔为5分钟

  25. 25

    如何基于熊猫时间序列中的5分钟间隔创建组ID?

  26. 26

    如何在Python中将1分钟的开-高-低-关数据转换为另一个时间范围(fx:5分钟1小时)?

  27. 27

    如何计算以每个日期的持续时间和15分钟的间隔记录的用户

  28. 28

    如何在SQL中将5分钟的时间戳间隔转换为1分钟的间隔,同时保留其他信息?

  29. 29

    PHP和MySQL:从数据库中选择未刷新超过2分钟的帐户

热门标签

归档