【问题标题】:SQL Dates SelectionSQL 日期选择
【发布时间】:2018-04-22 20:51:40
【问题描述】:

我有一个 OPL_Dates 表,其中开始日期和结束日期如下:

dbo.OPL_Dates
ID       Start_date       End_date
--------------------------------------
12345    1975-01-01       2001-12-31
12345    1989-01-01       2004-12-31
12345    2005-01-01       NULL
12345    2007-01-01       NULL
12377    2009-06-01       2009-12-31
12377    2013-02-07       NULL
12377    2010-01-01       2012-01-01
12489    2011-12-31       NULL
12489    2012-03-01       2012-04-01

我正在寻找的输出是:

ID       Start_date       End_date
-------------------------------------
12345    1975-01-01       2004-12-31
12345    2005-01-01       NULL
12377    2009-06-01       2009-12-31
12377    2010-01-01       2012-01-01
12377    2013-02-07       NULL
12489    2011-12-31       NULL

基本上,我想显示 OPL 期间(如果有)之间的差距,否则我需要开始日期的最小值和结束日期的最大值,对于特定的 ID。NULL 表示可以转换为“9999”的开放式日期-12-31 英寸。

【问题讨论】:

  • 没有相邻空行的间隙?
  • 添加赏金并提供所有场景
  • @maSTAShuFu 感谢您的回复,我不完全明白您的问题,但是,如果他的期间有间隔,每个 ID 的开始和结束日期。对于 12345,我想要他的开始日期是 1975-01-01,他的结束日期是 2004-12-31,因为开始日期 1989-01-01 已经包含在上述时间段内,然后是开始日期 2005-01 -01 到结束日期“NULL”作为开始日期 2007-01-01 也属于时间段 2005-01-01 到 NULL。
  • @maSTAShuFu 我添加了另一个场景。请看一下。如果您有任何问题,请告诉我。
  • 嗨,欢迎来到 SO。如果您为此编写了无法开始工作的代码,那么您来对地方了。只需edit your question 并将代码的相关部分添加到其中,因为没有它我们无能为力。另请参阅How to Ask

标签: sql sql-server tsql date


【解决方案1】:

以下内容几乎可以满足您的需求:

with p as (
      select v.*, sum(inc) over (partition by v.id order by v.dte) as running_inc
      from t cross apply
           (values (id, start_date, 1),
                   (id, coalesce(end_date, '2999-12-31'), -1)
           ) v(id, dte, inc)
     )
select id, min(dte), max(dte)
from (select p.*, sum(case when running_inc = 0 then 1 else 0 end) over (partition by id order by dte desc) as grp
      from p
     ) p
group by id, grp;

请注意,它将“无限期”结束日期从 NULL 更改为 2999-12-31。这是一种方便,因为NULL 在 SQL Server 升序排序中首先排序。

Here 是一个 SQL Fiddle。

这是在做什么?它将日期转换为单个列,并带有一个 1/-1 标​​志 (inc) 指示记录是开始还是结束。这个标志的运行总和然后指示应该组合的组。当运行总和为 0 时,则一个组已结束。要将结束日期包含在正确的组中,需要反向运行总和 - 但这是一个细节。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2014-11-29
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多