有一个PG数据库的日期表,怎么获取节假日的天数以及节假日对应的下一个工作日的数据

数据库表为table1

属性分别为:is_holiday, day_name,当is_holiday为N表示非节假日,当为Y表示节假日,day_name是date型

数据为:

is_holidayday_name
Y2021/1/1
Y2021/1/2
Y2021/1/3
N2021/1/4
N2021/1/5
N2021/1/6
N….
Y2021/2/11
Y2021/2/12
Y2021/2/13
Y2021/2/14
Y2021/2/15
Y2021/2/16
Y2021/2/17
N2021/2/18
N2021/2/19

 如何获取节假日天数?使得数据这样显示

is_holidayday_name节假日天数下个工作日
Y2021/1/132021/1/4
Y2021/1/232021/1/4
Y2021/1/332021/1/4
N2021/1/402021/1/4
N2021/1/502021/1/5
N2021/1/602021/1/6
N….0….
Y2021/2/1172021/2/18
Y2021/2/1272021/2/18
Y2021/2/1372021/2/18
Y2021/2/1472021/2/18
Y2021/2/1572021/2/18
Y2021/2/1672021/2/18
Y2021/2/1772021/2/18
N2021/2/1802021/2/18
N2021/2/1902021/2/19

                

FineReport SQL liuyunxia827729 发布于 2022-11-18 14:57 (编辑于 2022-11-18 15:30)
1min目标场景问卷 立即参与
回答问题
悬赏:0 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
liuyunxia827729Lv4见习互助
发布于2022-11-18 17:09

with 

w1 as --所有工作日

(

  select

    day_name, is_workday

  from

    dw_com.td_com_day

  where 1 = 1

  and  year_name = '2020'

  and is_workday = 'Y' 

),

w2 as  --找所有非工作日的下一个工作日

(

  select

    distinct

    t1.day_name,

    t1.is_workday,

    min(w1.day_name)over(partition by t1.day_name ) as aft_work_day

  from

    dw_com.td_com_day t1

  left join w1

  on t1.year_name = '2020'

  and  t1.day_name < w1.day_name

  where t1.year_name = '2020' and t1.is_workday = 'N'

),

w3 as --找所有非工作日的上一个工作日

(

  select

    distinct

    t1.day_name,

    t1.is_workday,

    max(w1.day_name)over(partition by t1.day_name )::date + 1  as first_festal_day

  from

    dw_com.td_com_day t1

  left join w1

  on t1.year_name = '2020'

  and  t1.day_name > w1.day_name

  where t1.year_name = '2020' and t1.is_workday = 'N'

)

  select

    t1.day_name::date,

    t1.is_workday,

    coalesce (w2.aft_work_day,t1.day_name) as aft_work_day,

    case when  w3.first_festal_day is null then 0 else count() over(partition by w3.first_festal_day) end as festal_days

  from

    dw_com.td_com_day t1

  left join w2 on t1.day_name = w2.day_name

  left join w3 on t1.day_name = w3.day_name

  where  t1.year_name = '2020'

最佳回答
0
luojian0323Lv7资深互助
发布于2022-11-18 15:02

很明显第二个表是手工数据。这个需要自己造数入库

国家节假日都是一年一定。

最佳回答
0
Z4u3z1Lv6专家互助
发布于2022-11-18 15:19

前两列在入库的时候为什么不把第三列一并入了。

另外可以用个存储过程(不知道PG有没),每一个月处理一次数据把节假日天数给统计出来,这样后期SQL简单查询速度也快

  • liuyunxia827729 liuyunxia827729(提问者) 我是用的别人创建的表
    2022-11-18 15:31 
  • Z4u3z1 Z4u3z1 回复 liuyunxia827729(提问者) 加字段,然后用存储过程处理好数据(一劳永逸)。后期SQL简单查询也快
    2022-11-18 15:33 
  • liuyunxia827729 liuyunxia827729(提问者) 回复 Z4u3z1 存储过程怎么写
    2022-11-18 15:38 
  • Z4u3z1 Z4u3z1 回复 liuyunxia827729(提问者) http://t.zoukankan.com/1314520xh-p-14587496.html 参考
    2022-11-18 15:39 
  • 1关注人数
  • 329浏览人数
  • 最后回答于:2022-11-18 17:09
    请选择关闭问题的原因
    确定 取消
    返回顶部