Postgres запрос - 24-часовой временной ряд, отфильтрованный по указанному столбцу c, но по-прежнему возвращает строку для каждого часа - PullRequest
1 голос
/ 12 июля 2020

Я работаю над запросом, который возвращает почасовые временные ряды для заданного дня, но мне нужно фильтровать по определенному столбцу в другой таблице, которая в моем случае является идентификатором пользователя.

Это это мой текущий запрос, который возвращает количество отправок за каждый час текущего дня:

SELECT hours, count(s.id)
FROM generate_series(current_date, current_date + interval '23h', cast('1h' as interval)) hours
         left join submission s on hours = date_trunc('hour', s.submitted_date)
group by hours
order by hours;

enter image description here

However, these records are irrespective of user id, so when I filter by user id with a query like this it will only return the hours for which a submission for that user was received when instead I need it to return records for every hour much like the query above:

SELECT hours, count(s.id)
FROM generate_series(current_date, current_date + interval '23h', cast('1h' as interval)) hours
    left join submission s on hours = date_trunc('hour', s.submitted_date)
    left join form f on s.form_custom_id = f.custom_id
    left join "user" u on f.user_id = u.id
    where u.id = 4
group by hours
order by hours;

enter image description here

Here's my SQL Fiddle: http://www.sqlfiddle.com/#! 17 / a8d80 / 1

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вы хотите переместить условие фильтрации для пользователя на сторону on соединения. Соответственно, нужно рассчитывать по столбцу из таблицы user, поэтому учитывается лог фильтрации c:

select hours, count(u.id)
from generate_series(current_date, current_date + interval '23h', cast('1h' as interval)) hours
left join submission s on hours = date_trunc('hour', s.submitted_date)
left join form f on s.form_custom_id = f.custom_id
left join "user" u on f.user_id = u.id and u.id = 4
group by hours
order by hours;
1 голос
/ 12 июля 2020

Для left join фильтрация по всей таблице, кроме первой, должна быть в предложении on:

select hours, count(s.id)
from generate_series(current_date, current_date + interval '23h', cast('1h' as interval)) hours left j oin
     submission s 
     on hours = date_trunc('hour', s.submitted_date) left join
     form f
     on s.form_custom_id = f.custom_id left join
     "user" u
     on f.user_id = u.id and u.id = 4
group by hours
order by hours;

В противном случае предложение where отфильтровывает несоответствующие строк, превращая внешнее соединение во внутреннее соединение.

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