当前位置: 首页 > 面试题库 >

来自具有连续日期范围记录的数据集中的最小日期和最大日期的日期范围

党宇定
2023-03-14
问题内容

我有一个ID为,状态和员工日期范围的数据集。
下面给出的输入数据集是一名员工的详细信息。
记录中的日期范围是连续的(按确切顺序),因此第二行的开始日期将是第一行的结束日期的下一个日期。

如果员工连续休假不同的月份,则该表将存储日期范围不同的信息。
例如:在输入集中,员工已从‘16 -10-2016’休病假到‘31 -12-2016’,并在‘1-1-2017’重新加入。
因此,该项目有3条记录,但日期是连续的。在输出中,我需要将此作为一条记录,如预期的输出数据集中所示。

输入

Id  Status   StartDate   EndDate

1   Active   1-9-2007    15-10-2016
1   Sick     16-10-2016  31-10-2016
1   Sick     1-11-2016   30-11-2016
1   Sick     1-12-2016   31-12-2016
1   Active   1-1-2017    4-2-2017  
1   Unpaid   5-2-2017    9-2-2017  
1   Active   10-2-2017   11-2-2017 
1   Unpaid   12-2-2017   28-2-2017 
1   Unpaid   1-3-2017    31-3-2017 
1   Unpaid   1-4-2017    30-4-2017 
1   Active   1-5-2017    13-10-2017
1   Sick     14-10-2017  11-11-2017
1   Active   12-11-2017  NULL

预期的输出

Id   Status    StartDate    EndDate

1    Active    1-9-2007     15-10-2016
1    Sick      16-10-2016   31-12-2016
1    Active    1-1-2017     4-2-2017  
1    Unpaid    5-2-2017     9-2-2017  
1    Active    10-2-2017    11-2-2017 
1    Unpaid    12-2-2017    30-4-2017 
1    Active    1-5-2017     13-10-2017
1    Sick      14-10-2017   11-11-2017
1    Active    12-11-2017   NULL

我不能按id,status进行min(startdate)和max(EndDate)组,因为如果同一位员工又请了一次病假,那么该结束日期(示例中为“11-11-2017”)将作为结束日期日期。

谁能帮我解决SQL Server 2014中的查询问题?


问题答案:

这是“分组和窗口”的一个示例

  • 首先,您为每个状态设置一个重置点
  • 设置组的总和
  • 然后获取每个组的最大/最小日期。
;with x as
(
    select Id, Status, StartDate,  EndDate,
           iif (lag(Status) over (order by Id, StartDate) = Status,

null, 1) rst
from emp
), y as
(
select Id, Status, StartDate, EndDate,
sum(rst) over (order by Id, StartDate) grp
from x
)

 select Id,
        MIN(Status) as Status,
        MIN(StartDate) StartDate,
        MAX(EndDate) EndDate
 from   y
 group by Id, grp
 order by Id, grp

GO
Id | Status | StartDate           | EndDate            
-: | :----- | :------------------ | :------------------
 1 | Active | 01/09/2007 00:00:00 | 15/10/2016 00:00:00
 1 | Sick   | 16/10/2016 00:00:00 | 31/12/2016 00:00:00
 1 | Active | 01/01/2017 00:00:00 | 04/02/2017 00:00:00
 1 | Unpaid | 05/02/2017 00:00:00 | 09/02/2017 00:00:00
 1 | Active | 10/02/2017 00:00:00 | 11/02/2017 00:00:00
 1 | Unpaid | 12/02/2017 00:00:00 | 30/04/2017 00:00:00
 1 | Active | 01/05/2017 00:00:00 | 13/10/2017 00:00:00
 1 | Sick   | 14/10/2017 00:00:00 | 11/11/2017 00:00:00
 1 | Active | 12/11/2017 00:00:00 | null        

dbfiddle在这里



 类似资料:
  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 问题内容: 我需要填充一个表,该表将存储2个给定日期之间的日期范围:09/01/11-10/10/11 因此,在这种情况下,该表将从2011年9月1日开始存储,直到每天存储到10/10/11,我想知道在SQL Server中是否有一种巧妙的方法-我目前正在使用SQL Server 2008 。 谢谢 问题答案: 在SQL 2005+上很容易;如果您有数字表或理货表,操作会更容易。我在下面伪造了它:

  • 问题内容: 我有一个带有卖单的表格,我想列出两个日期之间每天的卖单数量,并且不留日期间隔。 这是我目前所拥有的: 我得到的结果如下: 但是我想要得到的是: 那可能吗? 问题答案: 动态创建日期范围并针对您的订单表进行合并:- 这可以处理多达1000天的日期范围。 请注意,根据您用于日期的字段类型,可以轻松提高效率。 编辑-根据要求,以获取每月的订单数:-

  • 问题内容: 我的数据库中有以下一组匹配日期的日期(dd / MM / yyyy): 事件具有开始和结束日期(时间无关紧要),并且endDate为NULL表示事件仍在进行中。 我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件重叠。 因此,对于输入日期范围01/04/2009-30/06/2009,我希望得到以下结果: 注意,作为结果,两个相邻的重叠范围是可以接受的。 谁能用SQL算

  • 问题内容: 我正在尝试建立一个SQL查询,该查询将为我提供具有相同价格的日期的日期范围。如果价格出现突破,我希望能在新的行中看到它。即使一个月中的某个时间有相同的价格,但如果价格介于两者之间的某个时间有变化,我希望将其视为具有特定日期范围的两个单独的行。 样本数据: 所需结果: 问题答案: 非关系解决方案 我认为没有其他答案是正确的。 不会工作 使用会强制将数据放入物理的“记录归档系统”结构中,然

  • 问题内容: 我有一个表,其中每一行都有开始和结束日期时间。这些可以是短跨度或长跨度。 我想查询具有两个开始和停止日期时间的所有行的交集的总持续时间。 如何在MySQL中做到这一点? 还是必须选择与查询开始和结束时间相交的行,然后计算每行的实际重叠并将其累加到客户端? 举个例子,使用毫秒使它更清晰: 一些行: 我们想知道这些行在1030和1100之间的总时间。 让我们计算每行的重叠: 因此,本例中的