Группировать по часам, 0, если нет данных - PullRequest
1 голос
/ 06 августа 2020

У меня запрос следующего формата:

select status as status,
    count(*) as count,
    EXTRACT(
        hour
        from creationtime
    ) AS hour,
    creationtime::date as datee
from user_logging_table_detail
where creationtime::date = current_date
    and status = 'SUCCESS'
group by hour,
    creationtime::date,
    status
order by hour asc

status  count   hour    datee
SUCCESS  1  1   8/6/2020
SUCCESS  2  2   8/6/2020
SUCCESS 5   3   8/6/2020
SUCCESS 2   4   8/6/2020
SUCCESS 3   5   8/6/2020
SUCCESS 2   8   8/6/2020
Желаемый результат должен быть все часы

    status  count   hour    datee 
    SUCCESS  1  1   8/6/2020
    SUCCESS  2  2   8/6/2020
    SUCCESS 5   3   8/6/2020
    SUCCESS 2   4   8/6/2020
    SUCCESS 3   5   8/6/2020
    SUCCESS 0   6   8/6/2020
    SUCCESS 0   7   8/6/2020
    SUCCESS 2   8   8/6/2020

я имею в виду, что час (6,7) пришел со значением (0).

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Ваш синтаксис выглядит как Postgres с удобным generate_series():

select gs.hh, ultd.status, count(ultd.status) as count
from generate_series(current_date, now(), interval '1 hour') gs(hh) left join
     zainksa_mobileapp.user_logging_table_detail ultd
     on ultd.creationtime >= gs.hh and
        ultd.creationtime < gs.hh + interval '1 hour' and
        ultd.status = 'SUCCESS' 
group by gs.hh, ultd.status
order by hour asc
0 голосов
/ 06 августа 2020

Решение Гордона Линоффа элегантно, но я подумал, что предоставлю общую альтернативу c, которая не зависит от конкретной c Postgres функции:

WITH t AS
(
    SELECT m * 10 + n h
    FROM (VALUES (0), (1), (2)) v1(m)
    CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v2(n)
    where m * 10 + n < 25
)
select t.h, status as status,
    count(*) as count,
    EXTRACT(
        hour
        from creationtime
    ) AS hour,
    creationtime::date as datee
from t
 left join user_logging_table_detail
  on EXTRACT(hour from creationtime ) = t.h
   and creationtime::date = current_date
   and status = 'SUCCESS'
group by hour,
    creationtime::date,
    status
order by t.h;

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