PostgreSQL - 使用子查询生成系列

问题描述

使用Postgresql,我需要完成以下场景。我有一个名为routine 的表,我在其中存储 start_date 和 end_date 列。我有一个表叫作练习,我在其中存储与每个练习相关的所有数据,最后,我有一个叫routine_exercise 的表,我在其中创建了例行程序和练习之间的关系。每个例程可以有 7 天(一天表示一周中的某一天,例如:1 表示星期一等)的练习,并且每天可以有一个或多个练习。例如:

练习表

练习ID 姓名
1 练习 1
2 练习 2
3 练习 3

例行表

例程ID 姓名
1 例程 1
2 例程2
3 例程3

Routine_Exercise Table

练习ID 例程ID
1 1 1
2 1 1
3 1 1
1 1 2
2 1 3
3 1 4

我想做的事情是生成一个从 start_date 到 end_date 的系列(例如 03-25-2020 到 05-25-2020,两个月),并为每个日期分配它应该工作的天数. 例如,使用Routine_Exercise Table 中的数据,用户应该只锻炼天数:1、2、3、4,因此我想将该数字附加到每个日期。例如,像这样:

预期结果

日期 数量
03-25-2020 1
03-26-2020 2
03-27-2020 3
03-28-2020 4
03-29-2020
03-30-2020
03-31-2020
04-01-2020 1
04-02-2020 2
04-03-2020 3
04-04-2020 4
04-05-2020

关于如何实现这一点有什么建议或不同的想法吗?另一个不需要系列的解决方案? 提前致谢!

解决方法

您可以使用 generate_series 生成开始和结束输入日期之间的日期,然后对 left join 表执行 routine_exercise,如下所示:

SELECT t.d,re.day
  FROM generate_series(timestamp '2020-03-25',timestamp '2020-05-25',interval  '1 day') AS t(d)
  left join (select distinct day from Routine_Exercise re WHERE ROUTINE_ID = 1) re
    on mod(extract(day from (t.d -timestamp '2020-03-25')),7) + 1 = re.day;