Как правило, вы можете использовать функцию LAG
для проверки изменяющихся дат SCD.Пример (любые записи в наборе результатов представляют ошибки):
DECLARE @x table
(
loan_no int NOT NULL
, start date NOT NULL
, [exp] date NOT NULL
)
INSERT INTO @x
VALUES
(12345, '2019-01-01', '2019-01-31')
, (12345, '2019-02-01', '2019-02-28')
, (12345, '2019-03-01', '9999-12-31')
, (12345, '2019-04-01', '9999-12-31')
SELECT *
FROM
(
SELECT
loan_no
, start
, [exp]
, LAG([exp], 1, DATEADD(DAY, -1, start)) OVER (PARTITION BY loan_no ORDER BY start) last_exp
FROM @x
) Q
WHERE last_exp <> DATEADD(DAY, -1, start)
Для другого сценария, чтобы убедиться, что у вас всегда есть exp
дата '9999-12-31', вы можете использоватьпростой MAX
запрос:
SELECT loan_no
FROM @x
GROUP BY loan_no
HAVING MAX([exp]) <> '9999-12-31'
Вы также можете иметь их в одном запросе как что-то вроде:
SELECT *
FROM
(
SELECT
loan_no
, start
, [exp]
, LAG([exp], 1, DATEADD(DAY, -1, start)) OVER (PARTITION BY loan_no ORDER BY start) last_exp
, ROW_NUMBER() OVER (PARTITION BY loan_no ORDER BY start DESC) inverse
FROM @x
) Q
WHERE
last_exp <> DATEADD(DAY, -1, start)
OR inverse = 1 AND [exp] <> '9999-12-31'