postgresql - 如何在postgresql的以下条件下从三个表中检索信息
问题描述
我有三张桌子。
表格1:
T2_ID ver date boolean
---------------------------------------------------------
1 | X-20-50 | 2019-01-01 16:20:51.722336+00 | TRUE
2 | X-50-30 | 2019-02-26 16:20:51.722336+00 | TRUE
3 | X-20-32 | 2019-03-20 16:20:51.722336+00 | FALSE
1 | X-20-50 | 2019-01-09 16:20:51.722336+00 | FALSE
2 | X-20-50 | 2019-12-02 16:20:51.722336+00 | TRUE
3 | X-20-50 | 2019-01-24 16:20:51.722336+00 | TRUE
表_2:
id | type | scheduler
--------------------------------------------------
1 | ABC | w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12
2 | PQR | w5,w9
3 | TRC | w1,w4,w8
表3
start_date_of_ver | end_date_of_ver | ver_name
-----------------------------------------------------------
2019-01-01 00:00:00+00 | 2019-04-01 00:00:00+00 | X-20-50
2019-02-25 00:00:00+00 | 2019-05-26 00:00:00+00 | X-50-30
2019-03-15 00:00:00+00 | 2019-06-06 00:00:00+00 | X-20-32
表 4 应满足以下条件。
- 它以版本名称(ver_name)作为输入
- 从此(ver_name)中,如果版本周期为 3 个月,则它需要版本的开始日期和结束日期(来自 table_3),然后它创建 12 周表,其中 id(类型)作为第一列,并根据创建一个 12 周的条目到调度程序的表2。
- 表 4 上的信息将在表 1 具有该特定周的条目时更新,该条目为 TRUE
注:表 1,条目每天生成。
所需表:只有ver_name作为输入并计算下表。
当 table_1 没有任何条目时, table_4 应该如下所示
表_4:X-20-50
id_of_table_2 | week_1 | week_2 | week_3 | week_4 | week_5 | week_6 | week_7 | week_8 | week_9 | week_10 | week_11 | week_12 |
------------------------------------------------------------------------------------------------------------------------------
ABC | w1 | w2 | w3 | w4 | w5 | w6 | w7 | w8 | w9 | w10 | w11 | w12 |
PQR | | | | | w5 | | | | w9 | | | |
TRC | w1 | | | w4 | | | | w8 | | | | |
当 table_1 有条目时, table_4 应该如下所示
X-20-50
id_of_table_2 | week_1 | week_2 | week_3 | week_4 | week_5 | week_6 | week_7 | week_8 | week_9 | week_10 | week_11 | week_12 |
------------------------------------------------------------------------------------------------------------------------------
ABC | Done | Done | w3 | w4 | w5 | w6 | w7 | w8 | w9 | w10 | w11 | w12 |
PQR | | | | | w5 | | | | w9 | | | |
TRC | Done | | | w4 | | | | w8 | | | | |
解决方案
您的要求需要稍加改进。您指定检索每周数据但未能定义您的一周。它从哪一天开始?所有周都是 7 天吗?当 12 月 31 日在星期二是同一周的 1 月 3 日星期五时会发生什么(请参阅当年日历)。然后是用户输入及其代表的问题。它是期望的开始日期和星期是该日期和接下来的 6 天还是每周内的任何日期?
下面假设一个 ISO 8601 定义(谷歌它 - 很多东西)。每周从星期一开始,所有周均为 7 天。(因此,包含 2019 年 12 月 31 日的一周也包括 2020 年 1 月 3 日)。该例程提取用户输入的 ISO 年和 ISO 周日期。
--setup
create table weekly_something( c1 text, c2 text, date1 timestamptz, someem boolean);
insert into weekly_something( c1, c2, date1, someem )
values ('ABC','AB-20-50','2019-11-25 16:20:51.722336+00',TRUE)
, ('PQR','AB-50-30','2019-11-26 16:20:51.722336+00',TRUE)
, ('TRC','CD-20-32','2019-11-27 16:20:51.722336+00',FALSE)
, ('ABC','AB-20-50','2019-12-02 16:20:51.722336+00',FALSE)
, ('ABC','AB-20-50','2019-12-02 16:20:51.722336+00',TRUE)
, ('JFF','yy-45-89','2019-12-31 16:20:51.722336+00',TRUE)
, ('JFF','yy-89-30','2020-01-03 16:20:51.722336+00',TRUE) ;
-- JFF Just For Fun
-- SQL Function
create function week_of(week_date date)
returns setof weekly_something
language sql stable strict
as $$
select *
from weekly_something
where (extract('isoyear' from week_date), extract('week' from week_date)) =
(extract('isoyear' from date1), extract('week' from date1));
$$;
-- test
select * from week_of('2019-11-26');
select * from week_of('2019-12-30');
推荐阅读
- c# - 关于在 MVC 中处理范围和正则表达式验证器中的数字的说明
- c - 我是否为 trie 内部或外部调用函数分配内存?
- google-apps-script - Google Apps 脚本 Ui 提示方法的问题
- opencv - 将 CMake 与 OpenCV 一起使用时如何解决错误
- python - 如何使用正则表达式在 Python 中识别 C 函数定义及其数据类型和参数名称?
- reactjs - nav-toggle 没有显示其不可见的 reactjs
- javascript - 如何检测浏览器选项卡关闭事件
- linux - 使用节点脚本而不是 bash
- mongodb - 开启多IP访问 mongo v4.0.1
- windows-server-2016 - 为什么没有流量通过我的服务器,但是防火墙设置正确?