Вручную укажите начальное значение для Row_Number()
Я хочу определить начало ROW_NUMBER()
как 3258170
вместо 1
.
Я использую следующий SQL-запрос
SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'.
Однако указанный выше запрос не работает. Когда я говорю не работает, я имею в виду его выполнение, но оно не начинается с 3258170
. Может кто-нибудь мне помочь?
Причина, по которой я хочу указать номер строки, - это вставка строк из одной таблицы в другую. В первой таблице последний номер строки записи 3258169
, и когда я вставляю новые записи, я хочу, чтобы они имели номер строки из 3258170
.
Ответы
Ответ 1
Просто добавьте значение к результату row_number()
:
select 3258170 - 1 + row_number() over (order by (select NULL)) as idd
Предложение order by
row_number()
указывает, какой столбец используется для заказа. Указав там константу, вы просто говорите: "все имеет то же значение для целей заказа". Он не имеет ничего, ничего общего с первым выбранным значением.
Чтобы избежать путаницы, я заменил постоянное значение на NULL. В SQL Server я заметил, что это назначает последовательный номер без фактической сортировки строк - наблюдаемое преимущество производительности, но не то, что я видел задокументированным, поэтому мы не можем зависеть от него.
Ответ 2
Я чувствую, что это проще
ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0)
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170)
Ответ 3
Иногда....
ROW_NUMBER() может быть не лучшим решением, особенно если в базовом наборе данных могут быть дубликаты записей (для запросов JOIN и т.д.). Это может привести к возврату большего количества строк, чем ожидалось. Вы можете рассмотреть возможность создания SEQUENCE, который в некоторых случаях может рассматриваться как более чистое решение.
то есть:.
CREATE SEQUENCE myRowNumberId
START WITH 1
INCREMENT BY 1
GO
SELECT NEXT VALUE FOR myRowNumberId AS 'idd' -- your query
GO
DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves
GO
Недостатком является то, что последовательности могут быть сложными в сложных запросах с функциями DISTINCT, WINDOW и т.д. См. полную документацию последовательности здесь.