问题描述
使用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;