我有一个开始日期列表,如下所示-
开始日期按降序排序
开始日期总是按降序排列。我正在寻找一个postgresql查询,它可以给出以下输出-分组的开始日期
基本上,我试图从给定的列表中创建一组日期,这样一组中的每个日期都在距离相应组顶部的日期61天以内。例如-在输出中,
- 第1组有前4条记录,因为所有4个开始日期都在61以内记录第2天
- 第2组只包含第6条记录,因为它超过了61天远离第二名的记录
- 第3组包含第7行和第8行,因为它们大于61距离第六名的记录还有几天。但在61天内
p.S.我是postgresql和stackoverflow的新手。任何指针都将有助于
您的样本数据与您的样本输出不匹配。
您在样本输出中的计算是错误的,因为这是向后计数的,3月和10月都有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;
工作Fiddle演示