Выводить только уникальные строки для заданного временного диапазона - PullRequest
0 голосов
/ 19 марта 2019

Так что я хочу иметь все CHARGE, где HPDATUM на следующий больше, чем 1 год назад.

Текущий запрос выглядит так:

SELECT DISTINCT CHARGE, HPDATUM FROM dbo.table123 WHERE CHARGE = '8811985' GROUP BY CHARGE, HPDATUM

Это пример запроса с ограничением where на CHARGE, который будет пропущен в последнем запросе, чтобы получить все CHARGE.

Это пример вывода запроса выше:

CHARGE  HPDATUM

8811985  1999-10-08  | NEW ENTRY
8811985  2003-06-25  | NEW ENTRY
8811985  2003-06-26  | DUPLICATE TO THE ONE ABOVE
8811985  2004-09-04  | NEW ENTRY
8811985  2004-09-05  | DUPLICATE TO THE ONE ABOVE
8811985  2005-01-09  | DUPLICATE TOO

Ответы [ 2 ]

4 голосов
/ 19 марта 2019

Мы можем попытаться использовать LEAD/LAG здесь, чтобы сравнить текущую HPDATUM дату с теми, которые идут до / после в последовательности, для каждой группы начислений.

WITH cte AS (
    SELECT CHARGE, HPDATUM,
        LAG(HPDATUM, 1, DATEADD(year, -1, HPDATUM)) OVER (PARTITION BY CHARGE ORDER BY HPDATUM) HPDATUM_PREV,
        LEAD(HPDATUM, 1, DATEADD(year, 1, HPDATUM)) OVER (PARTITION BY CHARGE ORDER BY HPDATUM) HPDATUM_NEXT
    FROM dbo.table123
)

SELECT CHARGE, HPDATUM
FROM cte
WHERE
    DATEDIFF(year, HPDATUM, HPDATUM_PREV) >= 1 AND
    DATEDIFF(year, HPDATUM, HPDATUM_NEXT) >= 1;

Если вы хотите толькопроверьте в одном направлении, затем удалите одну из двух проверок опережения / отставания.Кроме того, если вы хотите видеть только один заряд, добавьте предложение WHERE к CTE.

0 голосов
/ 19 марта 2019

используйте оконную функцию LAG (), чтобы получить предыдущее значение строки HPDATUM и сравнить

CTE AS
(
    SELECT  t.CHARGE, t.HPDATUM,
            PREV_HPDATUM = LAG (t.HPDATUM) OVER (ORDER BY HPDATUM)
    FROM    dbo.table123 t
    WHERE   t.CHARGE = '8811985'
)
SELECT  CHARGE, HPDATUM
FROM    CTE
WHERE   PREV_HPDATUM    IS NULL
OR      HPDATUM     > DATEADD(YEAR, 1, PREV_HPDATUM)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...