【问题标题】:SQL write query that show the skipping between dates显示日期之间跳过的 SQL 写入查询
【发布时间】:2019-05-01 12:10:37
【问题描述】:

我尝试编写一个查询,通过显示跳跃开始之前的日期和跳跃之后的第一个日期来查找跳跃。

我试过了:

SELECT OrderDate FROM Orders

我得到了:

但我没有成功地将它们分成这样的间隙:

我该怎么做?

【问题讨论】:

  • 我在这里并不是要粗鲁,但你是在问一系列你承认是功课的问题。通过做一些研究和进行更多尝试,而不是尝试一次然后来到 SO 你会学到更多。就我个人而言,我认为您最好询问您不了解的功能或文档;这里发生的事情是我们正在有效地为您完成作业。那样你不会学到任何东西。

标签: sql sql-server northwind


【解决方案1】:

使用可以使用dense_rank()来生成一个序列。当您从日期中减去它时,您将识别出相邻的连续日期。

所以:

select min(orderdate), max(orderdate)
from (select o.*, dense_rank() over (order by orderdate) as seqnum
      from orders o
     ) o
group by dateadd(day, -seqnum, orderdate)
order by min(orderdate);

您需要dense_rank(),因为您的数据有重复项。

编辑:

要查找跳转,请使用LEAD()

select dateadd(day, 1, orderdate),
       dateadd(day, -1, next_orderdate)
from (select orderdate, lead(orderdate) over (order by orderdate) as next_orderdate
      from (select distinct orderdate orders o) o
     ) o
where next_orderdate > dateadd(day, 1, orderdate);

【讨论】:

  • 这是gaps and islands 的“岛屿”解决方案,我认为 OP 想要差距。
  • @GarethD 。 . .谢谢。
  • @GordonLinoff 谢谢!我试图只找到 1996-07-05 -> 1996-07-08 之类的差距,我需要在 WHERE 中更改什么?
  • @eliadchoen。 . .我将<> 更改为>。您只需调整 1 即可更改所需的最小间隙大小。
【解决方案2】:

试试这个:

with cte as (select ROW_NUMBER() OVER(ORDER BY OrderDate) as row_num,OrderDate from orders)
select 
curr.OrderDate as Gap_start, 
nex.OrderDate as Gap_end
from 
cte curr
left join
cte nex
on
curr.row_num = nex.row_num - 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多