Postgresql 重新格式化输出查询行和列

Postgresql 重新格式化输出查询行和列,postgresql,group-by,sum,pivot,Postgresql,Group By,Sum,Pivot,我有一个带有时间戳、传感器和每15分钟消息数的表,我希望重新排序 time sensor messages 2020-04-1 02:45:00 a 12 2020-04-1 02:30:00 a 7 2020-04-1 02:15:00 a 9 2020-04-1 02:00:00 a 10 2020-04-1 03:45:00 b 3 2020-04-1 03:30:00 b 7 2020

我有一个带有时间戳、传感器和每15分钟消息数的表,我希望重新排序

time               sensor messages
2020-04-1 02:45:00 a      12
2020-04-1 02:30:00 a      7  
2020-04-1 02:15:00 a      9  
2020-04-1 02:00:00 a     10 
2020-04-1 03:45:00 b      3  
2020-04-1 03:30:00 b      7  
2020-04-1 03:15:00 b      9  
2020-04-1 03:00:00 b      4  
2020-04-1 03:45:00 a     12 
2020-04-1 03:30:00 a      7  
2020-04-1 03:15:00 a      9  
2020-04-1 03:00:00 a      8 
我想要每天/每小时的邮件总数,如下表所示:

day(of the month)  0  1  2  3  4  5  ..  23
1                  38 36 0  0  0  0
这就是我在postgresql查询中所做的:

SELECT *   
FROM crosstab('SELECT
  to_char(time,''DD'')::integer AS "day",
  to_char(time,''HH24'')::integer AS "hour",
  sum(messages)::int AS "total"
FROM test
WHERE sensor = ''a''
GROUP by  to_char(time,''MM''),
          day,hour,sensor')
as ct (
 day integer
,hour_00 integer
,hour_01 integer
,hour_02 integer
,hour_03 integer
,hour_04 integer
,hour_05 integer
,hour_06 integer
,hour_07 integer
,hour_08 integer
,hour_09 integer
,hour_10 integer
,hour_11 integer
,hour_12 integer
,hour_13 integer
,hour_14 integer
,hour_15 integer
,hour_16 integer
,hour_17 integer
,hour_18 integer
,hour_19 integer
,hour_20 integer
,hour_21 integer
,hour_22 integer
,hour_23 integer)
但结果并不好

day hour_00 hour_01 hour_02 hour_03 hour_04 .... 
1   38                                           
1   36                                           
2   0 

您可以使用条件聚合。逻辑是:

select
    extract(day from time) day_of_month,
    sum(messages) filter(where extract(hour from time) = 0) hour_00,
    sum(messages) filter(where extract(hour from time) = 1) hour_01,
    ...,
    sum(messages) filter(where extract(hour from time) = 23) hour_23
from mytable
group by extract(day from time)
order by day_of_month

如果您希望每月每天和每个传感器有一行,则只需将传感器添加到
select
groupby
子句中即可。

您可以使用条件聚合。逻辑是:

select
    extract(day from time) day_of_month,
    sum(messages) filter(where extract(hour from time) = 0) hour_00,
    sum(messages) filter(where extract(hour from time) = 1) hour_01,
    ...,
    sum(messages) filter(where extract(hour from time) = 23) hour_23
from mytable
group by extract(day from time)
order by day_of_month
如果您希望每月每天和每个传感器有一行,则只需将
sensor
添加到
select
groupby
子句中即可