递归地将日期列表分成组

Recursively dividing a list of dates into groups

我有一个开始日期列表如下 -

start dates sorted in descending order

开始日期始终按降序排列。 我正在寻找可以提供以下输出的 postgresql 查询 - start dates with groups

基本上,我正在尝试从给定列表中创建日期组,以便组中的每个日期都在相应组顶部日期的 61 天内。 例如 - 在输出中,

P.S。我是 postgresql 和 Whosebug 的新手。 任何指针都会有帮助

您的示例数据与您的示例输出不匹配。

您在示例输出中的计算是错误的,因为这是倒数的,三月和十月都是 31 天。

要正确递归,您需要使用 dense_rank():

分配行号
with recursive num as (
  select row_number() over (order by start_date desc) as rn,
         start_date
    from dateslist
),

然后您创建组并通过在递归时向前传递锚值来查找差距。由于你有 start_date 信息,你可以同时计算组内的偏移量:

find_gaps as (
  select rn as anchor, start_date as anchor_date, rn, start_date, 0 as group_offset
    from num 
   where rn = 1
  union all
  select case 
           when f.anchor_date - n.start_date > 61 then n.rn
           else f.anchor
         end,
         case 
           when f.anchor_date - n.start_date > 61 then n.start_date
           else f.anchor_date
         end,
         n.rn, n.start_date, 
         case 
           when f.anchor_date - n.start_date > 61 then n.start_date
           else f.anchor_date
         end - n.start_date
    from find_gaps f
    join num n on n.rn = f.rn + 1
)

最终查询选择您想要的输出列并应用组号。

select start_date, 
       dense_rank() over (order by anchor) as group_number,
       group_offset
  from find_gaps
 order by start_date desc;

Working Fiddle Demo