我很难构建一个能够完成相对简单的任务的查询。
我有一张桌子可以叫data。此表有一个date列和一个将条目指定为daily数据或monthly数据的列。
我想检索所有daily记录,以及记录,其中没有月份记录。示例:如果存在每日记录monthly,那么我不想在2016-01-10上检索月记录
我觉得下面的查询应该可以实现这个目标,但是我不明白为什么它返回了太多的行(重复),并且当重复数据消除时,没有返回所需的集。

SELECT daily.*
FROM data daily
LEFT JOIN data monthly
    ON date_trunc('month', daily.date) != date_trunc('month', monthly.date)
AND monthly.interval='monthly'
WHERE daily.interval='daily'
    AND monthly.interval='monthly'

预期行为是返回左侧的所有记录、每日数据,并在不返回与任何每日记录具有相同月份的每月记录的条件下加入。

最佳答案

select *
from data d
where
    interval = 'daily'
    or
    interval = 'monthly'
    and
    not exists (
        select 1 from data
        where
            date_trunc('month', d.date) = date_trunc('month', date)
            and interval = 'daily'
    )

关于sql - 在同一张 table 上简单的左联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38240748/

10-12 06:30