在一个名为UserDays的表中,我有两个名为UserID和HolidayDate的列.以下是数据.

Userid holidaydate
1 2023-01-17
1 2023-03-21
1 2023-03-22
1 2023-03-23
1 2023-05-12
2 2023-09-15
3 2023-06-09
3 2023-06-28

对于每个用户,我们必须找到下一个工作日.2023-01-17的下一个工作日期是2023-01-18.2023-03-21的下一个工作日期是2023-03-24,因为2023-03-22和2023-03-23是假期

我需要以下输出的SQL查询:

Userid nextworkdate
1 2023-01-18
1 2023-03-24
1 2023-03-24
1 2023-03-24
1 2023-05-13
2 2023-09-16
3 2023-06-10
3 2023-06-29

推荐答案

你可以做一个窗口函数解决方案来得到下一个工作日:

select *
,   COALESCE(nextnonholiday, min(nextnonholiday) over(partition by userid order by holidaydate rows between 1 following and unbounded following), dateadd(day, 1, holidaydate)) as nextWorkDay
from (
    select *, case when lead(holidaydate) over(partition by userid order by holidaydate) <> dateadd(day, 1, holidaydate) then dateadd(day, 1, holidaydate) end as nextNonHoliday
    from (
        VALUES  (1, N'2023-01-17')
        ,   (1, N'2023-03-21')
        ,   (1, N'2023-03-22')
        ,   (1, N'2023-03-23')
        ,   (1, N'2023-05-12')
        ,   (2, N'2023-09-15')
        ,   (3, N'2023-06-09')
        ,   (3, N'2023-06-28')
    ) t (Userid,holidaydate)
    ) x
order by userid, holidaydate

首先判断下一个非假日是否与第二天相同,如果不是,这是我们想要的值,否则我们进入下一步.

在下一步中,我们得到第一个非假日日期,我们之前在一个"跟随"窗口函数中计算的,即.我们基本上是向前看,从桌子上拿出第一个非假日日期.

Sql相关问答推荐

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

SQL—如何在搜索的元素之后和之前获取元素?

对任何(数组)使用LIKE?

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

基于唯一值在Access查询中创建计数器

最近3个月收到的邮箱总数

对表进行多项 Select 以返回最大值和时间

在SQL GROUP BY中的某些行之后执行计算

按连续相等值分组排序

group-by-clause具有特定列,而不是oracle的toad中的all

获取分布在同一行的列中的出现次数

删除行而不使数据库超载

在 postgres 中插入或更新 jsonb 数组的对象

BigQuery数组是否包含NULL值的判断方法

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

try 将多行折叠为单个结果

Select 多年的日期范围

如何对 SQL 表中的连续时间戳进行分组?

Select 给定类别列表(或更多类别)中的所有事物

遍历数据,计算每个月最后三天的总和