Нужна помощь в поиске правильного запроса T-SQL - PullRequest
8 голосов
/ 23 мая 2011

Я не совсем уверен, как это сделать. В основном у меня есть такая таблица

UserId       DateRequested           Approved ApprovedBy  Notes
------------ ----------------------- -------- ----------- -----
1            2011-05-26               0        NULL        NULL
1            2011-05-27               0        NULL        NULL
1            2011-05-28               0        NULL        NULL
1            2011-06-05               0        NULL        NULL
1            2011-06-06               0        NULL        NULL
1            2011-06-25               0        NULL        NULL

Который в основном содержит дни, когда работник просит отпуск. Теперь, когда предоставляется день или дни, эти данные необходимо скопировать в таблицу вида

UserId DateFrom DateTo

Так что в основном для приведенных выше данных я хочу:

UserId DateFrom DateTo 
-------------------------------
1      2011-05-26 2011-05-28 
1      2011-06-05 2011-06-06 
1      2011-06-25 2011-06-25 

Т.е. я хочу последовательные дни в DateFrom и DateTo. Теперь я не уверен, как это сделать без использования цикла while. Это SQL, поэтому я бы предпочел не итеративное решение.

Пожалуйста, сообщите !!!

Ответы [ 2 ]

6 голосов
/ 23 мая 2011
;WITH cte AS
(
SELECT *,
        DATEDIFF(DAY,0,DateRequested)-
        ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY DateRequested) AS Grp
FROM YourTable  
WHERE Approved = 1 /*Presumably - but your example data doesn't show this.*/
)
SELECT UserId, 
       MIN(DateRequested) AS DateFrom, 
       MAX(DateRequested) AS DateTo  
FROM cte 
GROUP BY UserId,Grp
1 голос
/ 23 мая 2011

В Oracle PL / SQL это будет выглядеть следующим образом:

WITH cte
        AS (SELECT a.*,
                   daterequested - TRUNC (SYSDATE)
                   - ROW_NUMBER ()
                        OVER (PARTITION BY UserId ORDER BY DateRequested)
                      AS Grp
              FROM yourtable a
             WHERE Approved = 0)
  SELECT UserId, MIN (DateRequested) AS DateFrom, MAX (DateRequested) AS DateTo
    FROM cte
GROUP BY UserId, Grp;
...