如何在PostgreSQL中使用Lead函数合并日期

时间:2018-07-30 16:55:32

标签: sql postgresql

我正在使用generate_series函数来提取start_dateend_date之间的日期,并且我正在尝试使用daterange合并日期。我写了这个查询:

     with a as(
select d.day::date as day from (select * from generate_series('2018-08-22'::timestamp, '2019-07-12'::timestamp, 
concat(greatest(date_part('days','2019-07-12'::timestamp - '2018-08-22'::timestamp)/8,1), ' day')::interval)) as d(day))
select daterange(day,(lead(day) over (order by day) - interval '1 day')::date,'[]')
FROM a

我得到了这些结果:

"[2018-08-22,2018-10-01)"
"[2018-10-01,2018-11-11)"
"[2018-11-11,2018-12-21)"
"[2018-12-21,2019-01-31)"
"[2019-01-31,2019-03-12)"
"[2019-03-12,2019-04-22)"
"[2019-04-22,2019-06-01)"
"[2019-06-01,2019-07-12)"
"[2019-07-12,)"

我不想显示最后一行"[2019-07-12,)"。如何管理查询以不显示包含Infinity值的最后一行。

1 个答案:

答案 0 :(得分:1)

我将lead()移到CTE并使用基于此的逻辑:

with dr as (
      select gs.day::date as day, lead(gs.day) over (order by day) as next_day
      from generate_series('2018-08-22'::timestamp, '2019-07-12'::timestamp, 
                           concat(greatest(date_part('days','2019-07-12'::timestamp - '2018-08-22'::timestamp)/8,1), ' day')::interval
                          ) gs(day)
     )
select daterange(day, (next_day - interval '1 day')::date)
from dr
where next_day is not null