Postgresql оставшееся соединение date_trun c со значениями по умолчанию - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 3 таблицы, к которым я запрашиваю данные, основанные на разных условиях. У меня есть параметры from и to, и это те, которые я использую для создания диапазона времени, в течение которого я ищу данные в этих таблицах.

Например, если у меня есть from равно «2020-07-01», а to равно «2020-08-01». Я ожидаю получить сгруппированные значения строк таблиц по неделям, если в некоторых случаях некоторые из недель не будут У меня есть записи, которые я хочу вернуть 0, если в некоторых таблицах есть записи за ту же неделю, я бы хотел их просуммировать.

В настоящее время у меня есть это:

SELECT d.day, COALESCE(t.total, 0)
FROM  (
  SELECT day::date
  FROM generate_series(timestamp '2020-07-01',
                       timestamp '2020-08-01',
                       interval  '1 week') day
) d
LEFT JOIN (
  SELECT date AS day,
         SUM(total)
  FROM table1
  WHERE id = '1'
  AND date BETWEEN '2020-07-01' AND '2020-08-01'
  GROUP  BY day
) t USING (day)
ORDER BY d.day;

Я генерируя серию дат, сгруппированных по неделям, и вдобавок к этому я добавляю левое соединение. Теперь по какой-то причине он работает только в том случае, если даты полностью совпадают, иначе COALESCE(t.total, 0) возвращает 0, даже если на этой неделе SUM (total) не 0.

Так же, как я применяю LEFT JOIN , Я использую другие левые соединения с другими таблицами в том же запросе, поэтому у меня такая же проблема.

1 Ответ

3 голосов
/ 04 августа 2020

Пожалуйста, посмотрите, работает ли это для вас. Всякий раз, когда вы обнаруживаете, что собираете более одного раза, спросите себя, необходимо ли это.

Вместо того, чтобы пытаться сопоставить отдельные дни, используйте временные диапазоны. это с CTE.

Мой предыдущий пример с несколькими left join был плохим, потому что он выдувает строки из-за отсутствия условий соединения между таблицами, соединенными слева.

Есть интересный угловой регистр, например, от 2019-02-01 до 2019-03-01, который возвращает пустой интервал как последнюю неделю. Я обновился, чтобы отфильтровать это.

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