【问题标题】:How can I get the differences between the OrderStop date and the OrderStart date in the next column?如何在下一列中获取 OrderStop 日期和 OrderStart 日期之间的差异?
【发布时间】:2017-12-05 16:54:26
【问题描述】:

如何在下一列中获得OrderStopOrderStart 之间的区别?

例如,第 1 行的 OrderStop 日期为 2007 年 1 月 31 日我想计算下一个开始日期之间的天数 1/26/2007 我知道它们是重叠的。

ID  OrderStart  OrderStop
132 4/14/2006   1/31/2007
132 1/26/2007   3/14/2007
132 2/1/2007    3/2/2007
132 3/2/2007    3/14/2007
132 3/14/2007   1/8/2010
132 11/26/2008  1/20/2011
132 1/8/2010    7/14/2010
132 7/14/2010   8/15/2012
132 8/15/2012   1/17/2013
132 1/17/2013   3/22/2013
132 3/21/2013   5/2/2013
132 5/2/2013    8/2/2013
132 5/22/2013   8/2/2013
132 7/29/2013   3/6/2014
132 3/5/2014    7/16/2014
132 7/16/2014   6/19/2015
132 8/21/2014   6/19/2015
132 6/19/2015   4/1/2016
132 6/25/2015   9/9/2015
132 4/1/2016    5/3/2016
132 5/3/2016    7/27/2016
132 8/15/2016   11/2/2016

我正在努力完成以下任务。如何创建可以完成此任务的 SQL 语句?

132 4/14/2006   1/31/2007
132 1/26/2007   4/1/2016
132 4/1/2016    7/27/2016
132 8/15/2016   11/2/2016

【问题讨论】:

  • 请清理附件,阅读有关如何提问的常见问题解答。给我们你迄今为止尝试过的 SQL
  • Get previous and next row from rows selected with (WHERE) conditions 的可能重复项或关于lag()/lead() 的许多其他问题
  • 我认为这是不可能的。是否有一个 rec_id 字段使这些行中的每一行都是唯一的?
  • 您获得第二个数据集的标准不清楚,似乎与 OrderStop 和 OrderStart 之间的区别没有任何关系。

标签: sql-server tsql


【解决方案1】:

可消耗的样本数据使我们的工作变得更加轻松。 SQL server 的版本也是如此。以下是使用 2012 的 LEAD 功能的解决方案。第二个适用于 2012 年之前的系统;它完成了同样的事情,但需要自我加入,效率不高。

declare @orders table (id int, orderStart date, orderStop date);
insert @orders
values
(132,'4/14/2006 ','1/31/2007'),
(132,'1/26/2007 ','3/14/2007'),
(132,'2/1/2007  ','3/2/2007 '),
(132,'3/2/2007  ','3/14/2007'),
(132,'3/14/2007 ','1/8/2010 '),
(132,'11/26/2008','1/20/2011'),
(132,'1/8/2010  ','7/14/2010'),
(132,'7/14/2010 ','8/15/2012'),
(132,'8/15/2012 ','1/17/2013'),
(132,'1/17/2013 ','3/22/2013'),
(132,'3/21/2013 ','5/2/2013 '),
(132,'5/2/2013  ','8/2/2013 '),
(132,'5/22/2013 ','8/2/2013 '),
(132,'7/29/2013 ','3/6/2014 '),
(132,'3/5/2014  ','7/16/2014'),
(132,'7/16/2014 ','6/19/2015'),
(132,'8/21/2014 ','6/19/2015'),
(132,'6/19/2015 ','4/1/2016 '),
(132,'6/25/2015 ','9/9/2015 '),
(132,'4/1/2016  ','5/3/2016 '),
(132,'5/3/2016  ','7/27/2016'),
(132,'8/15/2016 ','11/2/2016');

select *, 
  nextStart   = lead(orderStart,1) over (order by orderStart),
  daysBetween = abs(datediff(day,lead(orderStart,1) over (order by orderStart), orderStop))
from @orders
order by orderStart;


with preSort as
(
  select *, rn = row_number() over (order by orderstart)
    from @orders
)
select p2.id, p2.orderStart, p2.orderStop , nextStart = p1.orderStart, 
  daysBetween = abs(datediff(day, p2.orderStop, p1.orderStart))
from preSort p1 join preSort p2 on p1.rn = p2.rn+1
order by p1.orderStart;

都返回

id          orderStart orderStop  nextStart  daysBetween
----------- ---------- ---------- ---------- -----------
132         2006-04-14 2007-01-31 2007-01-26 5
132         2007-01-26 2007-03-14 2007-02-01 41
132         2007-02-01 2007-03-02 2007-03-02 0
132         2007-03-02 2007-03-14 2007-03-14 0
132         2007-03-14 2010-01-08 2008-11-26 408
132         2008-11-26 2011-01-20 2010-01-08 377
132         2010-01-08 2010-07-14 2010-07-14 0
132         2010-07-14 2012-08-15 2012-08-15 0
132         2012-08-15 2013-01-17 2013-01-17 0
132         2013-01-17 2013-03-22 2013-03-21 1
132         2013-03-21 2013-05-02 2013-05-02 0
132         2013-05-02 2013-08-02 2013-05-22 72
132         2013-05-22 2013-08-02 2013-07-29 4
132         2013-07-29 2014-03-06 2014-03-05 1
132         2014-03-05 2014-07-16 2014-07-16 0
132         2014-07-16 2015-06-19 2014-08-21 302
132         2014-08-21 2015-06-19 2015-06-19 0
132         2015-06-19 2016-04-01 2015-06-25 281
132         2015-06-25 2015-09-09 2016-04-01 205
132         2016-04-01 2016-05-03 2016-05-03 0
132         2016-05-03 2016-07-27 2016-08-15 19
132         2016-08-15 2016-11-02 NULL       NULL

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2023-03-26
    • 2019-08-25
    • 1970-01-01
    • 2020-03-22
    • 2017-03-27
    相关资源
    最近更新 更多