有没有办法以特定日期频率(例如工作日)查询 table?
Is there a way to query a table in a specific date frequency (for example business days)?
假设我们有一个 SQL table 包含不同日期的条目,例如
main_table
:
id (PK)
日期(PK)
工作日
价值
1
'01-06-2021'
星期二
20
1
'02-06-2021'
周三
20
1
'04-06-2021'
周五
20
1
'05-06-2021'
星期六
20
1
'07-06-2021'
星期一
20
1
'08-06-2021'
星期二
20
我想检索“30-05-2021”和“07-06-2021”之间的条目。但结果 output_table
table 应该采用工作日格式,这样
output_table
:
id (PK)
日期(PK)
工作日
价值
1
'31-05-2021'
星期一
空
1
'01-06-2021'
星期二
20
1
'02-06-2021'
周三
20
1
'03-06-2021'
周四
空
1
'04-06-2021'
周五
20
1
'07-06-2021'
星期一
20
1
'08-06-2021'
星期二
20
如果我使用简单的 SELECT * WHERE date>='30-05-2021' AND date <= '07-06-2021'
查询 table ,则会出现以下问题:
- 日期“03-06-2021”(工作日)将丢失。
- “31-05-2021”将没有条目(不在 main_table 中)。
- 将检索日期“05-06-2021”,但该日期不是工作日(星期六)。
基本上我的想法是创建一个工作日 table (date_table
),然后在 date_table
:
上使用 main_table
的左连接
SELECT main_table.value
FROM date_table
LEFT JOIN main_table.id ON (date_table.weekly_dates = main_table.date AND main_table.id = 1)
WHERE date_table.weekly_dates >= '30-05-2021'
AND date_table.weekly_dates <= '07-06-2021'
ORDER BY date_table.weekly_dates
但是,有没有更优雅的解决方案,不需要创建额外的 table?有没有办法直接在 SQL 查询中使用它?我也不更喜欢查询table并使用编程语言重新索引table(例如,Python重新索引)。
非常感谢
Postgres 支持 generate_series()
这使得这非常简单:
select i.id, gs.date, to_char(gs.date, 'Dy') as dow, m.value
from (select distinct id from main_table) i cross join
generate_series('2021-05-30'::date, '2021-06-07'::date, interval '1 day'
) gs(date) left join
main_table m
on m.id = i.id and m.date = gs.date
where to_char(gs.date, 'Dy') not in ('Sat', 'Sun');
假设我们有一个 SQL table 包含不同日期的条目,例如
main_table
:
id (PK) | 日期(PK) | 工作日 | 价值 |
---|---|---|---|
1 | '01-06-2021' | 星期二 | 20 |
1 | '02-06-2021' | 周三 | 20 |
1 | '04-06-2021' | 周五 | 20 |
1 | '05-06-2021' | 星期六 | 20 |
1 | '07-06-2021' | 星期一 | 20 |
1 | '08-06-2021' | 星期二 | 20 |
我想检索“30-05-2021”和“07-06-2021”之间的条目。但结果 output_table
table 应该采用工作日格式,这样
output_table
:
id (PK) | 日期(PK) | 工作日 | 价值 |
---|---|---|---|
1 | '31-05-2021' | 星期一 | 空 |
1 | '01-06-2021' | 星期二 | 20 |
1 | '02-06-2021' | 周三 | 20 |
1 | '03-06-2021' | 周四 | 空 |
1 | '04-06-2021' | 周五 | 20 |
1 | '07-06-2021' | 星期一 | 20 |
1 | '08-06-2021' | 星期二 | 20 |
如果我使用简单的 SELECT * WHERE date>='30-05-2021' AND date <= '07-06-2021'
查询 table ,则会出现以下问题:
- 日期“03-06-2021”(工作日)将丢失。
- “31-05-2021”将没有条目(不在 main_table 中)。
- 将检索日期“05-06-2021”,但该日期不是工作日(星期六)。
基本上我的想法是创建一个工作日 table (date_table
),然后在 date_table
:
main_table
的左连接
SELECT main_table.value
FROM date_table
LEFT JOIN main_table.id ON (date_table.weekly_dates = main_table.date AND main_table.id = 1)
WHERE date_table.weekly_dates >= '30-05-2021'
AND date_table.weekly_dates <= '07-06-2021'
ORDER BY date_table.weekly_dates
但是,有没有更优雅的解决方案,不需要创建额外的 table?有没有办法直接在 SQL 查询中使用它?我也不更喜欢查询table并使用编程语言重新索引table(例如,Python重新索引)。
非常感谢
Postgres 支持 generate_series()
这使得这非常简单:
select i.id, gs.date, to_char(gs.date, 'Dy') as dow, m.value
from (select distinct id from main_table) i cross join
generate_series('2021-05-30'::date, '2021-06-07'::date, interval '1 day'
) gs(date) left join
main_table m
on m.id = i.id and m.date = gs.date
where to_char(gs.date, 'Dy') not in ('Sat', 'Sun');