Как сделать GROUP BY час и принять пропущенные часы как 0 в POSTGRESQL - PullRequest
1 голос
/ 28 февраля 2020

Я делаю GROUP BY час за один день. В этом случае есть некоторые временные интервалы без данных. Как я могу принять эти пропущенные часы как значение 0 ?. Тогда в моем запросе всегда будет значение 23. Ниже того, что я пробовал до сих пор.

SELECT COUNT(*), extract(hour from created_date) as hourr 
FROM client_requests 
WHERE created_date > '2020-02-24 00:00:00' and created_date < '2020-02-24 23:59:59' 
GROUP BY extract(hour from created_date) 
ORDER BY extract(hour from created_date) ASC

результат как ниже:

count                |     hourr    |
------------------------------------
1                    |      0
1                    |      6
5                    |      8
14                   |      9
35                   |      10
37                   |      11
40                   |      12
32                   |      13
18                   |      14
28                   |      15
39                   |      16
31                   |      17
30                   |      18
16                   |      19
7                    |      20
11                   |      21
14                   |      22

Но мне нужно вот так

count                |     hourr    |
------------------------------------
1                    |      0
0                    |      1
0                    |      2
0                    |      3
0                    |      4
0                    |      5
1                    |      6
0                    |      7
5                    |      8
14                   |      9
35                   |      10
37                   |      11
40                   |      12
32                   |      13
18                   |      14
28                   |      15
39                   |      16
31                   |      17
30                   |      18
16                   |      19
7                    |      20
11                   |      21
14                   |      22
0                    |      23

1 Ответ

2 голосов
/ 28 февраля 2020

Соединение влево с созданной таблицей часов:

SELECT coalesce(count(r.*), 0) AS count,
       h.h as hour
FROM generate_series(0, 23) AS h
   LEFT JOIN client_requests AS r
      ON extract(hour from r.created_date) = h.h
         AND r.created_date >= '2020-02-24 00:00:00'
         AND r.created_date < '2020-02-25 00:00:00' 
GROUP BY h.h
ORDER BY h.h;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...