我在构建一个可以完成相对简单的事情的查询时遇到了问题。
我有一个表,我们可以调用data
。此表有一个date
列和一个列,用于指定条目为daily
数据或monthly
数据。
我想要检索所有daily
条记录以及当月没有每日记录的monthly
条记录。示例:如果每日记录2016-01-10
存在,那么我不想在2016-01-01
上检索每月记录
我觉得以下查询应该是为了实现这个目标,但我无法弄清楚为什么它会返回太多行(重复)并且在重复数据删除时没有返回所需的集合。
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'
预期的行为是返回左侧的所有记录,每日数据,并在没有返回与每日记录具有相同月份的月度记录的条件下加入。
答案 0 :(得分:1)
您可以尝试以下查询并告诉我这是否适合您
SELECT monthly.*
FROM data monthly
where monthly.interval='monthly' and to_char(monthly.date, 'YYYY-MM') not in
(select to_char(daily.date, 'YYYY-MM') from data daily where daily.interval='daily' )
UNION
SELECT daily.*
FROM data daily
where daily.interval='daily'
答案 1 :(得分:1)
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'
)