Расчет SQL Server ROW_NUMBER () OVER () для производной таблицы

В некоторых других базах данных (например, DB2 или Oracle сROWNUM) Я могу опуститьORDER BY пункт в функции ранжированияOVER() пункт. Например:

ROW_NUMBER() OVER()

Это особенно полезно при использовании с упорядоченными производными таблицами, такими как:

SELECT t.*, ROW_NUMBER() OVER()
FROM (
    SELECT ...
    ORDER BY
) t

Как это можно эмулировать в SQL Server? Я нашел людей, использующихэто трюк, но это неправильно, так как он будет вести себя недетерминированно по отношению к порядку из производной таблицы:

-- This order here ---------------------vvvvvvvv
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM (
    SELECT TOP 100 PERCENT ...
    -- vvvvv ----redefines this order here
    ORDER BY
) t

Конкретный пример (как видно наSQLFiddle):

SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
  SELECT TOP 100 PERCENT 1 UNION ALL
  SELECT TOP 100 PERCENT 2 UNION ALL
  SELECT TOP 100 PERCENT 3 UNION ALL
  SELECT TOP 100 PERCENT 4
  -- This descending order is not maintained in the outer query
  ORDER BY 1 DESC
) t(v)

Кроме того, я не могу повторно использовать какое-либо выражение из производной таблицы для воспроизведенияORDER BY в моем случае, поскольку производная таблица может быть недоступна, поскольку она может быть предоставлена некоторой внешней логикой.

Так как я могу это сделать? Могу ли я сделать это вообще?

Ответы на вопрос(1)

Ваш ответ на вопрос