SQL Server: ACTUALIZA una tabla usando ORDER BY

Me gustaría saber si hay una forma de usar una orden por cláusula al actualizar una tabla. Estoy actualizando una tabla y estableciendo un número consecutivo, es por eso que el orden de la actualización es importante. Usando la siguiente instrucción sql, pude resolverlo sin usar un cursor:

DECLARE @Number INT = 0 UPDATE Test SET @Number = Number = @Number +1 

ahora lo que me gustaría hacer es una cláusula order by like like:

  DECLARE @Number INT = 0 UPDATE Test SET @Number = Number = @Number +1 ORDER BY Test.Id DESC 

He leído: Cómo actualizar y ordenar usando ms sql. Las soluciones a esta pregunta no resuelven el problema del pedido; solo filtran los elementos en los que se aplica la actualización.

Cuídate, Martin

No.

No es una forma documentada 100% compatible. Hay un enfoque utilizado a veces para calcular totales acumulados llamado ” actualización peculiar ” que sugiere que podría actualizarse en orden de índice agrupado si se cumplen ciertas condiciones, pero hasta donde yo sé, esto depende completamente de la observación empírica más que de cualquier garantía.

Pero, ¿en qué versión de SQL Server estás? Si SQL2005 + es posible que pueda hacer algo con row_number y un CTE (puede actualizar el CTE)

 With cte As ( SELECT id,Number, ROW_NUMBER() OVER (ORDER BY id DESC) AS RN FROM Test ) UPDATE cte SET Number=RN 

No puede usar ORDER BY como parte de la instrucción UPDATE (puede usar en sub selecciones que son parte de la actualización).

 UPDATE Test SET Number = rowNumber FROM Test INNER JOIN (SELECT ID, row_number() OVER (ORDER BY ID DESC) as rowNumber FROM Test) drRowNumbers ON drRowNumbers.ID = Test.ID 

Editar

La siguiente solución podría tener problemas con los índices agrupados involucrados como se menciona aquí . Gracias a Martin por señalar esto.

La respuesta se mantiene para educar a aquellos (como yo) que no conocen todos los efectos secundarios o las entradas y salidas de SQL Server.


Ampliando la respuesta gaven de Quassnoi en su enlace, siguiendo trabajos

 DECLARE @Test TABLE (Number INTEGER, AText VARCHAR(2), ID INTEGER) DECLARE @Number INT INSERT INTO @Test VALUES (1, 'A', 1) INSERT INTO @Test VALUES (2, 'B', 2) INSERT INTO @Test VALUES (1, 'E', 5) INSERT INTO @Test VALUES (3, 'C', 3) INSERT INTO @Test VALUES (2, 'D', 4) SET @Number = 0 

 ;WITH q AS ( SELECT TOP 1000000 * FROM @Test ORDER BY ID ) UPDATE q SET @Number = Number = @Number + 1 

La función row_number () sería el mejor enfoque para este problema.

 UPDATE T SET T.Number = R.rowNum FROM Test T JOIN ( SELECT T2.id,row_number() over (order by T2.Id desc) rowNum from Test T2 ) R on T.id=R.id 

Me encontré con el mismo problema y pude resolverlo de una manera muy poderosa que permite posibilidades ilimitadas de clasificación.

Creé una Vista usando (guardando) 2 órdenes de clasificación (* explicación sobre cómo hacerlo a continuación).

Después de eso, simplemente apliqué las consultas de actualización a la Vista creada y funcionó de maravilla.

Aquí están las 2 consultas que utilicé en la vista:

Primera consulta:

 Update MyView Set SortID=0 

2da consulta:

 DECLARE @sortID int SET @sortID = 0 UPDATE MyView SET @sortID = sortID = @sortID + 1 

* Para poder guardar la clasificación en la Vista, pongo TOP en la instrucción SELECT. Esta solución muy útil permite que los resultados de Vista se devuelvan ordenados como establecidos cuando se creó la Vista cuando se abre la Vista. En mi caso, se veía así:

(NOTA: El uso de esta solución colocará una gran carga en el servidor si se usa una tabla grande y, por lo tanto, se recomienda incluir el menor número posible de campos en la vista si se trabaja con tablas grandes)

 SELECT TOP (600000) dbo.Items.ID, dbo.Items.Code, dbo.Items.SortID, dbo.Supplier.Date, dbo.Supplier.Code AS Expr1 FROM dbo.Items INNER JOIN dbo.Supplier ON dbo.Items.SupplierCode = dbo.Supplier.Code ORDER BY dbo.Supplier.Date, dbo.Items.ID DESC 

En ejecución: SQL Server 2005 en un servidor de Windows 2003

Palabras clave adicionales: cómo actualizar una columna SQL con números ascendentes o descendentes – Valores numéricos / cómo establecer el orden en la statement de actualización SQL / cómo guardar el pedido en sql view / increment sql update / auto autoincrement sql update / create sql field with ascending números

actualización basada en Ordenar por orden de valores en una cláusula SQL IN ()

Solución:

 DECLARE @counter int SET @counter = 0 ;WITH q AS ( select * from Products WHERE ID in (SELECT TOP (10) ID FROM Products WHERE ID IN( 3,2,1) ORDER BY ID DESC) ) update q set Display= @counter, @counter = @counter + 1 

Estas actualizaciones se basan en descender 3,2,1

Hope ayuda a alguien

 SET @pos := 0; UPDATE TABLE SET position = ( SELECT @pos := @pos + 1 ) ORDER BY updated_at DESC; 

Tuve un problema similar y lo resolví usando ROW_NUMBER () en combinación con la palabra clave OVER. La tarea era rellenar retrospectivamente un nuevo campo TicketNo (entero) en una tabla simple basada en el Fecha de creación original y agrupado por ModuleId, de manera que los números de ticket comenzaran en 1 dentro de cada grupo de Módulo y se incrementaran por fecha. La tabla ya tenía una clave primaria TicketID (un GUID).

Aquí está el SQL:

 UPDATE Tickets SET TicketNo=T2.RowNo FROM Tickets INNER JOIN (select TicketID, TicketNo, ROW_NUMBER() OVER (PARTITION BY ModuleId ORDER BY DateCreated) AS RowNo from Tickets) AS T2 ON T2.TicketID = Tickets.TicketID 

Funcionó una delicia!

He probado el siguiente código en MYSQL para actualizar el último registro. Por eso estoy usando el orden en primer lugar. Actualizará la columna de estado del último registro.

  UPDATE DBTest.logTable SET status='Test' ORDER BY ID DESC limit 1 ;