左外连接2列

时间:2018-11-02 17:52:04

标签: sql postgresql join

我在使用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)

编辑: This db-fiddle gives my full query.我省略了一些where子句,因为我认为这无关紧要,但这似乎是问题的一部分。考虑到这一点,我选择的答案将解决此结构/查询表示的问题,但是@Gordon Linoff的答案对于原始问题是正确的。

2 个答案:

答案 0 :(得分:1)

这是您要寻找的吗?

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;

答案 1 :(得分:0)

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子句的一部分移到联接本身中。