Postgres查询,如果满足条件,则有条件地从记录子集中返回一个值

时间:2019-06-20 20:07:21

标签: sql postgresql

给定一个带有时间戳和值的数据集,我想运行一个查询,对于给定的一天,如果记录的值为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)来做到这一点

1 个答案:

答案 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;