Как сделать группировку по диапазону дат? - PullRequest
0 голосов
/ 07 октября 2011

Рассмотрите эту структуру таблицы.

 Key       ID       VISITDATE
 1         1        2011-01-07
 2         1        2011-01-09
 3         2        2011-01-10
 4         1        2011-01-12
 5         3        2011-01-12
 6         1        2011-01-15
 7         2        2011-01-21
 9         1        2011-02-28
 10        2        2011-03-21
 11        1        2011-01-06

Мне нужно получить все идентификаторы, Key, min (VisitDate), где VisitDate находится в промежутке в 10 дней? Если у вас есть два посещения в течение 10 дней, нужна одна строкачтобы быть там в результате.

Результат

 KEY      ID        VISITDATE
 11        1         2011-01-06
 3         2         2011-01-10
 5         3         2011-01-12
 7         2         2011-01-21
 9         1         2011-02-28
10         2         2011-03-21

Это можно сделать без самостоятельного объединения.У меня есть запрос, который самостоятельно соединяется с таблицей по ID и проверяет datediff.Есть ли лучшее решение? Можем ли мы использовать рекурсивный CTE здесь?

EDIT

Предпочитают решение, которое может использовать индекс по столбцу даты

1 Ответ

2 голосов
/ 07 октября 2011

Да, CTE будет хорошо работать для этого (все, что у меня есть, это CTE в последнее время) ...

;WITH TenDayVisits
AS (

SELECT 
        ID
        ,MIN(VisitDate) AS VisitDate
    FROM Visits
    GROUP BY ID
    UNION ALL
    SELECT
        t.ID
        ,v.VisitDate
    FROM Visits AS v
    JOIN TenDayVisits AS t ON v.ID = t.ID               
        AND DATEDIFF(dd,t.Visitdate,v.VisitDate) > 10
)

SELECT
    DISTINCT  
    v.[key]
    ,t.id
    ,t.VisitDate
FROM TenDayVisits as T
JOIN Visits AS v ON t.id = v.id
    AND t.VisitDate = v.VisitDate
...