Левое внешнее соединение с 2 столбцами - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблема с присоединением postrgresql. Возможно, я подхожу к этому неправильно, но вот сценарий.

У меня есть таблица, которая содержит два соответствующих столбца: даты и месяцы (вместе с другими данными). С каждой датой должны быть связаны следующие 5 месяцев, включительно. Это не всегда так; Я хочу выяснить, когда это не так. Кроме того, нет никакой гарантии, что каждая дата находится в таблице (для которой должно быть 5 месяцев), но у меня есть другая таблица, которая содержит эти даты.

Таблица должна содержать (на одну дату):

Expected

Однако из-за множества возможностей таблица может содержать только:

Possible

Я попытался найти пропущенные даты, сгенерировав ряд ожидаемых дат и присоединившись к серии месяцев, которые должны быть связаны с датой. Я столкнулся с проблемой, потому что мне нужно объединить таблицы в двух столбцах, которые мне нужны, поэтому, если один из них не существует, он не проходит через предложение ON или WHERE.

Возможно, мне нужно подойти к этому по-другому, но вот моя текущая попытка.

SELECT 
    D.date, JOINMONTH::date, DT.month
FROM
    day D
CROSS JOIN
    generate_series(date_trunc('month', D.date),
                    date_trunc('month', D.date) + INTERVAL '4 months',
                    '1 month') AS JOINMONTH
LEFT JOIN 
    dates_table DT ON D.date = DT.date 
                   AND JOINMONTH::date = DT.month
WHERE
    D.date >= '2018-01-01';

Что бы я хотел увидеть:

Result (goal)

EDIT: Этот db-fiddle дает мой полный запрос. Я пропустил некоторые из предложения where, потому что я думал, что это не имеет значения, но, похоже, это часть проблемы. Имея это в виду, мой выбранный ответ решит мою проблему, представленную этой структурой / запросом, но ответ @Gordon Linoff является правильным для исходного вопроса.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018
SELECT D.date, JOINMONTH::date, DT.month
FROM day D 
CROSS JOIN LATERAL
     generate_series(date_trunc('month', D.date),
                     date_trunc('month', D.date) + INTERVAL '4 months',
                     '1 month') AS JOINMONTH 
LEFT JOIN dates_table DT
    ON D.date = DT.date 
    AND JOINMONTH::date = DT.month
    AND DT.source = 'S1' AND
    DT.tf = TRUE
WHERE 
    D.date = '2018-11-02';

Мне нужно было переместить части моего предложения where в само соединение.

0 голосов
/ 02 ноября 2018

Это то, что вы ищете?

SELECT D.date, JOINMONTH::date, DT.month
FROM day D CROSS JOIN LATERAL
     generate_series(date_trunc('month', D.date),
                     date_trunc('month', D.date) + INTERVAL '4 months',
                     '1 month') AS JOINMONTH LEFT JOIN
     dates_table DT
     ON GD.date = DT.date AND JOINMONTH::date = DT.month
WHERE D.date >= '2018-01-01' AND DT.date IS NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...