Другой результат с таблицей температур и CTE - PullRequest
0 голосов
/ 29 мая 2020

У нас есть таблица 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, я получу именно то, что ожидаю.

...