; WITH Base AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY Period DESC) RN FROM #MyTable WHERE Period <= 201003
)
SELECT * FROM Base WHERE RN = 1
Использование CTE и ROW_NUMBER () (мы берем все строки с Period <= выбранной датой и выбираем верхнюю (ту, с автоматически сгенерированной ROW_NUMBER () = 1) </p>
; WITH Base AS
(
SELECT *, 1 AS RN FROM #MyTable WHERE Period = 201003
)
, Alternative AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY Period DESC) RN FROM #MyTable WHERE NOT EXISTS(SELECT 1 FROM Base) AND Period < 201003
)
, Final AS
(
SELECT * FROM Base
UNION ALL
SELECT * FROM Alternative WHERE RN = 1
)
SELECT * FROM Final
Этот намного сложнее, но делает почти то же самое. Он более "императивен, как". Сначала он пытается найти строку с точным Периодом, и, если он не существует, делает то же самое, что и раньше.В конце он объединяет два набора результатов (один из двух всегда пуст). Я всегда использовал бы первый, если бы профилирование не показало мне, что SQL не смог понять, что я пытаюсь сделать. Затем япопробую второй.