递归地为一行中两个日期之间的每个日期创建多行
recursively creating multiple rows for every date between two dates in one row
我将员工假期 (rdos) 存储在一行中,我非常接近递归地扩展它们以显示每一天休假的完整行。
运行 这在 Postgres 数据库版本 10.10
数据集:
id |user_id|start_date|finish_date|
---|-------|----------|-----------|
412| 14|2020-10-20| 2020-10-22|
411| 137|2020-10-20| 2020-10-30|
406| 78|2020-07-18| 2020-07-18|
405| 109|2020-07-22| 2020-07-23|
403| 37|2020-06-10| 2020-06-10|
我目前的查询:
with recursive rdos(id,user_id,start_date,finish_date,dates,depth,path,cycle) AS (
select
staff_rdos.id,
staff_rdos.user_id,
staff_rdos.start_date,
staff_rdos.finish_date,
staff_rdos.start_date::timestamp,
1,
ARRAY[staff_rdos.id::INT],
false
from staff_rdos
union all
select
staff_rdos.id,
staff_rdos.user_id,
staff_rdos.start_date,
staff_rdos.finish_date,
rdos.dates + interval '1 day',
rdos.depth + 1,
path || rdos.depth + 1,
staff_rdos.id = ANY(path)
from rdos, staff_rdos
where rdos.dates + interval '1 day' <= staff_rdos.finish_date
and rdos.dates + interval '1 day' >= staff_rdos.start_date
and not cycle
)select * from rdos
limit 200
我得到了重复的回归和不需要的交叉匹配。
有什么想法吗?我已经看到类似的解决方案依赖于几个月的联合 table,但我不知道这是否适用于此。
不需要递归查询来完成这样的任务在 Postgres 中:您可以只使用 generate_series()
和横向连接:
select sr.id, sr.user_id, x.vacation_date
from staff_rdoos sr
cross join lateral generate_series(sr.start_date, sr.end_date, '1 day') x(vacation_date)
我将员工假期 (rdos) 存储在一行中,我非常接近递归地扩展它们以显示每一天休假的完整行。 运行 这在 Postgres 数据库版本 10.10
数据集:
id |user_id|start_date|finish_date|
---|-------|----------|-----------|
412| 14|2020-10-20| 2020-10-22|
411| 137|2020-10-20| 2020-10-30|
406| 78|2020-07-18| 2020-07-18|
405| 109|2020-07-22| 2020-07-23|
403| 37|2020-06-10| 2020-06-10|
我目前的查询:
with recursive rdos(id,user_id,start_date,finish_date,dates,depth,path,cycle) AS (
select
staff_rdos.id,
staff_rdos.user_id,
staff_rdos.start_date,
staff_rdos.finish_date,
staff_rdos.start_date::timestamp,
1,
ARRAY[staff_rdos.id::INT],
false
from staff_rdos
union all
select
staff_rdos.id,
staff_rdos.user_id,
staff_rdos.start_date,
staff_rdos.finish_date,
rdos.dates + interval '1 day',
rdos.depth + 1,
path || rdos.depth + 1,
staff_rdos.id = ANY(path)
from rdos, staff_rdos
where rdos.dates + interval '1 day' <= staff_rdos.finish_date
and rdos.dates + interval '1 day' >= staff_rdos.start_date
and not cycle
)select * from rdos
limit 200
我得到了重复的回归和不需要的交叉匹配。
有什么想法吗?我已经看到类似的解决方案依赖于几个月的联合 table,但我不知道这是否适用于此。
不需要递归查询来完成这样的任务在 Postgres 中:您可以只使用 generate_series()
和横向连接:
select sr.id, sr.user_id, x.vacation_date
from staff_rdoos sr
cross join lateral generate_series(sr.start_date, sr.end_date, '1 day') x(vacation_date)