sql查询以查找全天状态的变化

v7pvogib  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(338)

我有一个名为 STATUS_HISTORY id—记录的id(id和rev的组合是唯一的)
rev-修订id,如果任何记录发生更改,将使用递增的修订id创建一个新条目
状态-它可以包含三个值
打开
关闭
进行中
updated \u by \u id-更新记录的用户的id
更新的时间戳-此记录是何时更新的。
任务id-状态正在更改的任务
现在一天中一个记录可以移动到不同的状态。
我正在寻找一个能给出如下回答的查询:

╔═════════════════╤══════╤════════════╤═══════╗
║ Hour_of_the_day │ OPEN │ INPROGRESS │ CLOSE ║
╠═════════════════╪══════╪════════════╪═══════╣
║ 1               │ 10   │ 0          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 2               │ 10   │ 0          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 3               │ 10   │ 0          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 4               │ 9    │ 1          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 5               │ 9    │ 1          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 6               │ 8    │ 2          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 7               │ 8    │ 2          │ 0     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 8               │ 8    │ 1          │ 1     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 9               │ 8    │ 0          │ 2     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 10              │ 6    │ 2          │ 2     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 11              │ 6    │ 1          │ 3     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 12              │ 5    │ 2          │ 3     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 13              │ 4    │ 3          │ 3     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 14              │ 4    │ 3          │ 3     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 15              │ 2    │ 3          │ 5     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 16              │ 1    │ 2          │ 7     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 17              │ 0    │ 1          │ 9     ║
╟─────────────────┼──────┼────────────┼───────╢
║ 18              │ 0    │ 0          │ 10    ║
╟─────────────────┼──────┼────────────┼───────╢
║ 19              │ 0    │ 0          │ 10    ║
╟─────────────────┼──────┼────────────┼───────╢
║ 20              │ 0    │ 0          │ 10    ║
╟─────────────────┼──────┼────────────┼───────╢
║ 21              │ 0    │ 0          │ 10    ║
╟─────────────────┼──────┼────────────┼───────╢
║ 22              │ 0    │ 0          │ 10    ║
╟─────────────────┼──────┼────────────┼───────╢
║ 23              │ 0    │ 0          │ 10    ║
╟─────────────────┼──────┼────────────┼───────╢
║ 24              │ 0    │ 0          │ 10    ║
╚═════════════════╧══════╧════════════╧═══════╝

注意:假设一个任务被标记为打开,并且在过去的5个小时内状态没有变化,则必须对所有5个小时进行计数。其他状态如close和inprogress也一样,因为不是所有的条目每小时都会改变。
基本上每小时有多少票是开放的,关闭的或进行中。
我不知道如何为这个逻辑编写查询。但下面是我的尝试,它给出了完全不同的输出。

SELECT TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24') AS hour,
         COUNT(*) AS numPerHour, t.STATUS
    FROM STATUS_HISTORY t
    WHERE t.UPDATED_TIMESTAMP  >= to_date('29-OCT-18','DD-MON-YY')
    AND t.UPDATED_TIMESTAMP     < to_date('30-OCT-18','DD-MON-YY')
GROUP BY TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24'), t.STATUS;

╔═════════════════╤════════════╤════════════╗
║ Hour_of_the_day │ NumPerHour │ INPROGRESS ║
╠═════════════════╪════════════╪════════════╣
║ 06              │ 2          │ OPEN       ║
╟─────────────────┼────────────┼────────────╢
║ 09              │ 5          │ OPEN       ║
╟─────────────────┼────────────┼────────────╢
║ 09              │ 2          │ OPEN       ║
╟─────────────────┼────────────┼────────────╢
║ 09              │ 3          │ CLOSE      ║
╟─────────────────┼────────────┼────────────╢
║ 07              │ 1          │ INPROGRESS ║
╟─────────────────┼────────────┼────────────╢
║ 08              │ 8          │ OPEN       ║
╟─────────────────┼────────────┼────────────╢
║ 11              │ 1          │ CLOSE      ║
╟─────────────────┼────────────┼────────────╢
║ 08              │ 1          │ INPROGRESS ║
╟─────────────────┼────────────┼────────────╢
║ 07              │ 3          │ OPEN       ║
╟─────────────────┼────────────┼────────────╢
║ 11              │ 2          │ CLOSE      ║
╟─────────────────┼────────────┼────────────╢
║ 12              │ 1          │ INPROGRESS ║
╚═════════════════╧════════════╧════════════╝

我想了解一下是否有其他方法可以通过java程序处理它,或者查询可以提供这个结果。

14ifxucb

14ifxucb1#

你可以用一个箱子:

SELECT TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24') AS hour,
         COUNT(*) AS numPerHour, sum(case when t.STATUS='OPEN' then 1 ELSE 0 END) AS OPEN,
         sum(case when t.STATUS='CLOSE' then 1 ELSE 0 END) AS CLOSE,
         sum(case when t.STATUS='INPROGRESS' then 1 ELSE 0 END) AS INPROGRESS

    FROM STATUS_HISTORY t
    WHERE t.UPDATED_TIMESTAMP  >= to_date('29-OCT-18','DD-MON-YY')
    AND t.UPDATED_TIMESTAMP     < to_date('30-OCT-18','DD-MON-YY')
GROUP BY TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24'), t.STATUS
xnifntxz

xnifntxz2#

使用条件聚合。

select COUNT( CASE WHEN STATUS = 'OPEN' THEN 1 END ) as OPEN,
       COUNT( CASE WHEN STATUS = 'INPROGRESS' THEN 1 END ) as INPROGRESS,
       COUNT( CASE WHEN STATUS = 'CLOSE' THEN 1 END ) as CLOSE
      ....
      ....
 GROUP BY TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24') --remove t.STATUS

相关问题