переформатировать строки и столбец выходного запроса - PullRequest
1 голос
/ 20 апреля 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 

1 Ответ

0 голосов
/ 20 апреля 2020

Вы можете использовать условное агрегирование. Логика c:

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 и group by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...