【问题标题】:Oracle SQL - count number of active/open tickets per hour by dayOracle SQL - 每天每小时计算活动/打开票的数量
【发布时间】:2021-08-31 16:11:33
【问题描述】:

我有一个来自 oracle db 的数据集,看起来像这样:

ticket_num start_date          repair_date
1          1/1/2021 02:05:15   1/4/2021 09:30:00
2          1/2/2021 12:15:45   1/2/2021 14:03:00
3          1/2/2021 12:20:00   1/2/2021 13:54:00

我需要计算一个小时内的有效票数。因此,如果该票在该小时之前打开,并在该小时之后关闭,它将被计算在内。无论在此期间是否有有效票证,都需要表示所有日期和时间。预期的输出是:

month    day    hour   #active_tix
1        1      2      1
1        1      3      1
...
1        2      12     3
1        2      13     3
1        2      14     2
1        2      15     1
...
1        4      9      1
1        4      10     0

任何帮助将不胜感激。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您需要一个日历表。在下面的查询中,它是动态创建的

    select c.hstart, count(t.ticket_num) n
    from (
        -- create calendar on the fly
        select timestamp '2021-01-01 00:00:00' + NUMTODSINTERVAL(level-1, 'hour') hstart
        from dual
        connect by timestamp '2021-01-01 00:00:00' + NUMTODSINTERVAL(level-1, 'hour') < timestamp '2022-01-01 00:00:00'
    ) c
    left join mytable t on t.start_date < c.hstart and t.repair_date >= c.hstart
    group by c.hstart
    order by c.hstart
    

    【讨论】:

    • 这行得通,但如果限制为几天,则需要很长时间。原始 start_date 和 repair_date 存储为整数(纪元时间)。到时间戳的转换是否会导致查询仅针对 2k 条记录进行 10 分钟?
    • @tony_g,start_date 和 repair_date 上的索引会有所帮助。还要重构查询,使 calendar.hstart 列与相关表中的列具有相同的类型。
    • 将日历 hstart 转换为 epoch 并加入它,然后将显示的数据转换为时间戳运行得更快。 dba 让我很难为日期列编制索引(出于某种原因)感谢您的帮助 Serg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2021-03-12
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多