2016-07-12 3 views
0

예 데이터 :병합 두 레코드 날짜 ToDate 두 번째 FromDate SQL Server?

FK_EmployeeId FromDate     ToDate      DateDiff 
20325   2016-06-24 00:00:00.000 2016-06-25 00:00:00.000  2 
20325   2016-06-25 00:00:00.000 2016-06-26 00:00:00.000  2 
20325   2016-06-26 00:00:00.000 2016-06-28 00:00:00.000  3 
20325   2016-06-28 00:00:00.000 2016-06-29 00:00:00.000  2 
20325   2016-06-29 00:00:00.000 2016-06-30 00:00:00.000  2 
20325   2016-06-30 00:00:00.000 2016-07-01 00:00:00.000  2 
20325   2016-07-01 00:00:00.000 2016-07-02 00:00:00.000  2 
20325   2016-07-02 00:00:00.000 2016-07-03 00:00:00.000  2 
20325   2016-07-03 00:00:00.000 2016-07-04 00:00:00.000  2 
20325   2016-07-04 00:00:00.000 2016-07-05 00:00:00.000  2 

그리고 나는 다음과 같은 출력을 좀하고 싶습니다 : 당신이 스스로 기록에 가입하기 위해 윈도우 기능을 사용하여 아래의 식으로 뭔가를하려고 생각

FK_EmployeeId FromDate     ToDate      DateDiff 
20325   2016-06-24 00:00:00.000 2016-06-26 00:00:00.000  3 
20325   2016-06-28 00:00:00.000 2016-07-05 00:00:00.000  8 
+0

데이터에서 모든 ToDate는 FromDate와 일치하므로 두 결과 행의 파생 방식을 설명 할 수 있습니까? –

+0

.. 그리고 그 후에 당신이 쓴 쿼리를 보여줄 수 있습니까? – niksofteng

답변

1

을 2 행에 걸쳐 날짜 비교를 수행합니다.

사람들이 이미 의견에 제안했듯이 위의 샘플 데이터에는 모든 순차적 날짜가 포함되어 있으므로 실제로 이것이 어떻게 작동하는지 예상하지 못합니다. 따라서 샘플 데이터의 중간 값을 제외하고 접근 방법을 보여줍니다.

--TABLE JUST FOR EXAMPLE QUERY 
DECLARE @SomeTable TABLE ([FK_EmployeeId] INT,[FromDate] DATETIME,[ToDate] DATETIME,[DateDiff] INT) 

--YOUR SAMPLE DATA 
INSERT INTO @SomeTable 
    ([FK_EmployeeId],[FromDate],[ToDate],[DateDiff]) 
SELECT 20325,'2016-06-24 00:00:00.000','2016-06-25 00:00:00.000',2 
UNION SELECT 20325,'2016-06-25 00:00:00.000','2016-06-26 00:00:00.000',2 
UNION SELECT 20325,'2016-06-26 00:00:00.000','2016-06-28 00:00:00.000',3 
UNION SELECT 20325,'2016-06-28 00:00:00.000','2016-06-29 00:00:00.000',2 
UNION SELECT 20325,'2016-06-29 00:00:00.000','2016-06-30 00:00:00.000',2 
--UNION SELECT 20325,'2016-06-30 00:00:00.000','2016-07-01 00:00:00.000',2 --<< 
UNION SELECT 20325,'2016-07-01 00:00:00.000','2016-07-02 00:00:00.000',2 
UNION SELECT 20325,'2016-07-02 00:00:00.000','2016-07-03 00:00:00.000',2 
UNION SELECT 20325,'2016-07-03 00:00:00.000','2016-07-04 00:00:00.000',2 
UNION SELECT 20325,'2016-07-04 00:00:00.000','2016-07-05 00:00:00.000',2 

--THE POINT: 
;WITH cte AS 
    (
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY [FK_EmployeeId] ORDER BY [ToDate]) AS 'RowNo' 
    FROM 
     @SomeTable 
    ) 

SELECT 
    a.*, 
    DATEDIFF(DAY,a.[FromDate],b.[ToDate]) AS 'NewDiff' 
FROM 
    cte a 
    JOIN cte b 
     ON a.[RowNo] + 1 = b.[RowNo] 
WHERE 
    a.[ToDate] <> b.[FromDate] 

다음 번 질문에 조금 더 자세하게 기입하십시오.

+0

답변을 주셔서 감사합니다,하지만 일단 Datediff = 2 위의 출력을 얻으려면 행을 병합 – devDalida1996

관련 문제