Especificar manualmente el valor inicial para el número de fila()


Quiero definir el inicio de ROW_NUMBER() como 3258170 en lugar de 1.

Estoy usando la siguiente consulta SQL

SELECT ROW_NUMBER() over(order by (select 3258170))  as 'idd'.

Sin embargo, la consulta anterior no funciona. Cuando digo que no funciona me refiero a su ejecución, pero no a partir de 3258170. ¿Alguien puede ayudarme?

La razón por la que quiero especificar el número de fila es que estoy insertando filas de una tabla a otra. En la primera Tabla el número de fila del último registro es 3258169 y cuando inserto nuevos registros quiero que tengan la fila número de 3258170.

Author: Adam Wenger, 2013-03-05

3 answers

Simplemente agregue el valor al resultado de row_number():

select 3258170 - 1 + row_number() over (order by (select NULL)) as idd

La cláusula order by de row_number() especifica qué columna se utiliza para el orden por. Al especificar una constante allí, simplemente estás diciendo "todo tiene el mismo valor para fines de pedido". No tiene nada, nada en absoluto que ver con el primer valor elegido.

Para evitar confusiones, reemplacé el valor constante por NULL. En SQL Server, he observado que esto asigna un número secuencial sin realmente ordenar las filas an una ventaja de rendimiento observada, pero no una que he visto documentada, así que no podemos depender de ella.

 46
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-04 20:15:15

Siento que esto es más fácil

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)
 7
Author: Tom McDonough,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-19 09:28:37

A veces....

El ROW_NUMBER() puede no ser la mejor solución, especialmente cuando podría haber registros duplicados en el conjunto de datos subyacente (para consultas de combinación, etc.).). Esto puede resultar en más filas devueltas de lo esperado. Puede considerar la creación de una SECUENCIA que en algunos casos puede considerarse una solución más limpia. es decir:

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

La desventaja es que las secuencias pueden ser difíciles de usar en consultas complejas con DISTINTAS funciones de VENTANA, etc. Ver el completo documentación de la secuencia aquí .

 1
Author: Milan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 21:07:16