给定一个带有时间戳和值的数据集,我想运行一个查询,对于给定的一天,如果记录的值为0,则该天将返回0;如果仅存在非零值,则返回1。那天。如果当天没有记录,请返回0。
例如,使用给定的数据集。
2019-06-20 23.1
2019-06-20 22.4
2019-06-20 23.1
2019-06-18 23.2
2019-06-18 0
2019-06-18 22.8
我希望将其退回:
2019-06-20 1 -- only non-zero values for 6/20
2019-06-19 0 -- no data for 06/19
2019-06-18 0 -- 06/18 has a zero value
我知道我可以编写一个存储过程来做到这一点,但是希望我可以通过查询(可能是CTE)来做到这一点
答案 0 :(得分:1)
您可以将聚合与generate_series()
一起使用:
select d.day,
(case when min(t.value) > 0 then 1 else 0 end) as flag
from (select generate_series(min(day), max(day), interval '1 day') as day
from t
) d left join
t
on t.day = d.day
group by d.day
order by d.date;
这假定值是非负的(如您的示例所示)。如果您可以使用负值:
select d.day,
(case when count(*) filter (where t.value = 0) = 0 and
count(t.value) > 0
then 1 else 0
end) as flag
from (select generate_series(min(day), max(day), interval '1 day') as day
from t
) d left join
t
on t.day = d.day
group by d.day
order by d.date;