【问题标题】:compare oracle row count between different dates hourly每小时比较不同日期之间的 oracle 行数
【发布时间】:2021-01-29 20:18:20
【问题描述】:

我正在使用这个 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 |

【问题讨论】:

    标签: sql oracle count case format-truncation


    【解决方案1】:

    使用条件聚合:

    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 有一个时间组件,您不必关心它的过滤目的。

    【讨论】:

    • @waseemaltakhin 。 . .如果这回答了您的问题,您可以接受它作为答案。
    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2012-12-29
    • 2015-06-26
    • 2012-11-22
    相关资源
    最近更新 更多