2017-12-05 2 views
0

다음 열의 orderstoporderstart 사이의 차이점을 얻으려면 어떻게해야합니까?다음 열의 orderstop과 orderstart 사이의 차이점은 어떻게 얻을 수 있습니까?

예를 들어, 행 1은 orderstop의 1/31/207입니다. 다음 시작일 사이의 날짜를 계산하고 싶습니다. 1/26/2017 나는 그것이 겹치는 것을 알고 있습니다.

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 
+1

PLZ는 첨부 청소 질문을하는 방법에 대한 FAQ를 참조하십시오. 우리에게 지금까지 시도한 SQL을 제공하십시오 – EoinS

+0

[(WHERE) 조건으로 선택한 행에서 이전 및 다음 행 가져 오기] (https://stackoverflow.com/questions/27086377/get-previous-and-next- 행으로부터 행 선택 조건과 함께) 또는'lag()'/'lead()'에 관한 다른 많은 질문 –

+0

이것이 어떻게 배치되었는지는 생각할 수 없습니다. 각 행을 고유하게 만드는 rec_id 필드가 있습니까? – briskovich

답변

1

소비가 가능한 샘플 데이터는 우리를 훨씬 쉽게 만듭니다. 그래서 SQL 서버 버전입니다. 아래는 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