每小时比较不同日期之间的oracle行数

问题描述

我正在使用此SQL查询三天前每小时的行数...

select trunc(sendtime,'hh24'),count(*)  
FROM t_sendedmsglog
where msgcontext like '%sm_%_tone_succ%' and sendtime > sysdate -3
group by trunc(sendtime,'hh24') 
order by trunc(sendtime,'hh24') desc;

结果显示为:

例如:

     #|Trunc(SENDTIME,'HH24')|COUNT(*)|
    1|10/15/2020|12:00:00 PM|593|
    2|10/15/2020|11:00:00 AM|889|
    3|10/15/2020|10:00:00 AM|854|
    4|10/15/2020|9:00:00 AM|1027|
    5|10/15/2020|8:00:00 AM|8409|
    .
    .
    .

    12|10/15/2020|1:00:00 AM|101|
    13|10/15/2020|281|
    14|10/14/2020|11:00:00 PM|722|
    15|10/14/2020|10:00:00 PM|1381|
    16|10/14/2020|9:00:00 PM|2123|
    .
    .
    25|10/14/2020|12:00:00 PM|1195|
    26|10/14/2020|11:00:00 AM|1699|
    27|10/14/2020|10:00:00 AM|747|
    28|10/14/2020|9:00:00 AM|827|
    .
    .
    40|10/13/2020|9:00:00 PM|2058|
    41|10/13/2020|8:00:00 PM|2800|

但是我如何使结果显示如下,所以我可以比较同一小时内不同天之间的计数?

hour|10/12/2020|10/13/2020|10/14/2020|count(*)
11:00:00 PM|618 |509 |722 |
10:00:00 PM|3181|1144|1381|
09:00:00 PM|3520|2058|2123|
08:00:00 PM|3688|2800|9347|
07:00:00 PM|3648|3166|3469|
06:00:00 PM|3628|2973|4518|
05:00:00 PM|3644|2429|3607|
04:00:00 PM|3652|3678|2291|
03:00:00 PM|1017|7711|819 |
02:00:00 PM|814 |7693|1310|
01:00:00 PM|856 |825 |848 |
12:00:00 PM|558 |1531|1195|
11:00:00 AM|0   |1132|1699|
10:00:00 AM|0   |732 |747 |
09:00:00 AM|0   |709 |827 |
08:00:00 AM|0   |1256|947 |
07:00:00 AM|0   |1465|1502|
06:00:00 AM|0   |749 |780 |
05:00:00 AM|0   |181 |169 |
04:00:00 AM|0   |46  |32  |
03:00:00 AM|0   |23  |34  |
02:00:00 AM|0   |46  |39  |
01:00:00 AM|0   |82  |81  |
00:00:00 AM|0   |    |218 |

解决方法

使用条件聚合:

select trunc(sendtime,'hh24'),count(*) as total,sum(case when trunc(sendtime) = trunc(sysdate) - interval '2' day then 1 else 0 end) as yester2day,sum(case when trunc(sendtime) = trunc(sysdate) - interval '1' day then 1 else 0 end) as yesterday,sum(case when trunc(sendtime) = trunc(sysdate) - interval '0' day then 1 else 0 end) as today
from t_sendedmsglog
where msgcontext like '%sm_%_tone_succ%' and
      sendtime >= trunc(sysdate) - interval '2' day
group by trunc(sendtime,'hh24') 
order by trunc(sendtime,'hh24') desc;

请注意,我也在where子句中调整了日期比较。在Oracle中,sysdate有一个时间部分,您不需要考虑它的过滤时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...