递归地将日期列表分成组
Recursively dividing a list of dates into groups
我有一个开始日期列表如下 -
start dates sorted in descending order
开始日期始终按降序排列。
我正在寻找可以提供以下输出的 postgresql 查询 -
start dates with groups
基本上,我正在尝试从给定列表中创建日期组,以便组中的每个日期都在相应组顶部日期的 61 天内。
例如 -
在输出中,
- 第 1 组有前 4 条记录,因为所有 4 个开始日期都在 61 以内
记录天数2.
- 第 2 组仅包含记录号。 6 因为超过 61 天
远离记录号2.
- 组 3 包含行号。 7 和 8,因为他们超过 61 岁
距离记录号的天数6. 但彼此相隔 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;
我有一个开始日期列表如下 -
start dates sorted in descending order
开始日期始终按降序排列。 我正在寻找可以提供以下输出的 postgresql 查询 - start dates with groups
基本上,我正在尝试从给定列表中创建日期组,以便组中的每个日期都在相应组顶部日期的 61 天内。 例如 - 在输出中,
- 第 1 组有前 4 条记录,因为所有 4 个开始日期都在 61 以内 记录天数2.
- 第 2 组仅包含记录号。 6 因为超过 61 天 远离记录号2.
- 组 3 包含行号。 7 和 8,因为他们超过 61 岁 距离记录号的天数6. 但彼此相隔 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;