【问题标题】:SQL - Select dates, omitting those after a gap appearsSQL - 选择日期,在出现间隔后省略日期
【发布时间】:2016-10-03 15:57:47
【问题描述】:

我有一些订购日期:

2013-01-01
2013-02-01
2014-01-01
2014-06-01
2016-01-01
2016-03-01

我想只取那些在一年或更长时间出现之前存在的那些,所以我的输出应该是:

2013-01-01
2013-02-01
2014-01-01
2014-06-01

(在 2014-06-01 和 2016-01-01 之间跳转大于 1 年)

在 SQL 中是否有一种简单优雅的方式来执行此操作?通常我会将数据分成 2 个表,将行号分配给一个表偏移一个,然后计算每个日期之间的差异,注意出现第一个间隙的行号。

这是一个我似乎经常遇到的问题,并且会从一个简单的解决方案中受益匪浅。

【问题讨论】:

  • 你的方法听起来不错。在带有行号的 cte 中执行此操作,然后再进行选择。

标签: sql


【解决方案1】:

如果您有可用的窗口函数

Declare @YourTable table (SomeDate Date)
Insert Into @YourTable values
('2013-01-01'),
('2013-02-01'),
('2014-01-01'),
('2014-06-01'),
('2016-01-01'),
('2016-03-01')


;with cteBase as (
    Select *,PrevYear=Lag(Year(SomeDate),1,Year(SomeDate)) over (Order By SomeDate)
     From  @YourTable
)
Select * from cteBase where Year(SomeDate)-PrevYear=0

返回

SomeDate    PrevYear
2013-01-01  2013
2013-02-01  2013
2014-06-01  2014
2016-03-01  2016

【讨论】:

  • @FBryant87 承认我在引入窗口函数时做了一些小动作,这并不羞耻。我应该补充一点,这很难看。
猜你喜欢
  • 2021-04-04
  • 2012-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多