如何创建一个 table 包含给定年份中已知日期 7 天范围内的所有日期(来自单独的 table)
How to create a table containing all dates in a given year that are within a 7-day range of known dates (from a separate table)
我有一个 table(假期)包含一年中的所有假期:
我需要创建一个 table (t1),其中 1 列包含一年中的所有 365 天,另一列 'description' 包含所有日期的假期名称假期的 +/- 7 天范围,并且 'None' 对于超出此范围的所有日期。
我能够使用 generate_series 创建第一列(my_date:一年内所有 365 天)并使用左连接尝试创建第二列(说明)
WITH all_dates AS
SELECT my_date::date
FROM generate_series('2020-01-01', '2020-12-31', '1 day'::interval) my_date)
SELECT all_dates.my_date,
holidays.description
FROM all_dates
LEFT JOIN holidays
ON all_dates.my_date = holidays.holiday_date
创建下面的table。
但是,我需要将 2020-01-02、2020-01-02、...、2020-01-08 描述为“元旦”,因为这些日期在元旦的 7 天范围,其他假期 7 天范围内的其他日子等等(例如,2020-12-18 到 2020-12-31 之间日期的行将具有描述 'Christmas')
我也不确定如何处理超过一个假期的 7 天范围内的日子(父亲节和独立日有重叠的日期在 7 天范围内)。我需要它在 2020 年每天只有一行。
如有任何帮助,我们将不胜感激!
试试下面的方法。您已经有了假期周围的范围,所以在连接中使用它。然后,使用 distinct on
将每个日历日期的结果限制为一个,并调整 order by
以保留您想要的假期。
with all_dates as (
select my_date::date
from generate_series('2020-01-01',
'2020-12-31', '1 day'::interval) my_date
)
select distinct on (all_dates.my_date)
all_dates.my_date,
holidays.description
from all_dates
left join holidays
on all_dates.my_date
between holidays.holiday_date_min7
and holidays.holiday_date_plus7
order by all_dates.my_date,
abs(all_dates.my_date - holidays.holiday_date), -- keep closest
all_dates.my_date - holidays.holiday_date -- prefer upcoming holiday
我有一个 table(假期)包含一年中的所有假期:
我需要创建一个 table (t1),其中 1 列包含一年中的所有 365 天,另一列 'description' 包含所有日期的假期名称假期的 +/- 7 天范围,并且 'None' 对于超出此范围的所有日期。
我能够使用 generate_series 创建第一列(my_date:一年内所有 365 天)并使用左连接尝试创建第二列(说明)
WITH all_dates AS
SELECT my_date::date
FROM generate_series('2020-01-01', '2020-12-31', '1 day'::interval) my_date)
SELECT all_dates.my_date,
holidays.description
FROM all_dates
LEFT JOIN holidays
ON all_dates.my_date = holidays.holiday_date
创建下面的table。
但是,我需要将 2020-01-02、2020-01-02、...、2020-01-08 描述为“元旦”,因为这些日期在元旦的 7 天范围,其他假期 7 天范围内的其他日子等等(例如,2020-12-18 到 2020-12-31 之间日期的行将具有描述 'Christmas')
我也不确定如何处理超过一个假期的 7 天范围内的日子(父亲节和独立日有重叠的日期在 7 天范围内)。我需要它在 2020 年每天只有一行。
如有任何帮助,我们将不胜感激!
试试下面的方法。您已经有了假期周围的范围,所以在连接中使用它。然后,使用 distinct on
将每个日历日期的结果限制为一个,并调整 order by
以保留您想要的假期。
with all_dates as (
select my_date::date
from generate_series('2020-01-01',
'2020-12-31', '1 day'::interval) my_date
)
select distinct on (all_dates.my_date)
all_dates.my_date,
holidays.description
from all_dates
left join holidays
on all_dates.my_date
between holidays.holiday_date_min7
and holidays.holiday_date_plus7
order by all_dates.my_date,
abs(all_dates.my_date - holidays.holiday_date), -- keep closest
all_dates.my_date - holidays.holiday_date -- prefer upcoming holiday