У нас есть таблица FederalReserveHolidays. Он хотел получить динамически последний день набора записей. Он отправил мне это
DECLARE
@dt DATE = '2020-05-25'
,@numDays INT = 3
,@sameDayDays INT = 1;
SELECT Date = MAX(d.Date)
FROM (
SELECT TOP (@sameDayDays+1) Row = ROW_NUMBER() OVER (ORDER BY Date)
,Date
FROM dbo.FederalReserveHolidays
WHERE IsBusinessDay = 1
AND Date >= @dt
) d
Внутренний запрос имеет результат 2020-05-27 и 2020-05-26 (не моя таблица, я бы не выбрал эту структуру даты, а не часть вопроса) . Однако этот внешний запрос возвращает 2099-12-31, максимальную дату в таблице. Я получаю то же самое с CTE:
;with cte AS
(
SELECT TOP (@sameDayDays+1) Row = ROW_NUMBER() OVER (ORDER BY Date)
,Date
FROM dbo.FederalReserveHolidays
WHERE IsBusinessDay = 1
AND Date >= @dt
)
SELECT MAX(date) FROM cte
, но он возвращает ожидаемый 2020-05-27, если я использую временную таблицу
SELECT TOP (@sameDayDays+1) Row = ROW_NUMBER() OVER (ORDER BY Date)
,Date
into #temp
FROM dbo.FederalReserveHolidays
WHERE IsBusinessDay = 1
AND Date >= @dt
SELECT MAX(date) FROM #temp
Итак, почему CTE и внутренний запрос не обеспечивает верхний предел? Если я просто выберу все из CTE, я получу именно то, что ожидаю.