sirve que para over optimizar lentas ejemplos consultas avg sql sql-server stored-procedures greatest-n-per-group

sql - que - Obtenga la última fecha para cada registro



sql max group by (4)

Así es como lo haría

;WITH CTE AS ( Select PartId, MAX(LASTUPDATED) as ''MAXX'' from part group by PartId ) Select TransActionId, p.PartId, Description, p.LASTUPDATED from Part p inner join CTE on p.LastUpdated = CTE.MAXX and p.PartId = CTE.PartId

Tengo una tabla de historial (como un registro) que registra los cambios en las partes:

TransactionID Part ID Description Last Updated 1 1 Fixed O-ring 2006-03-14 20:00:04.700 2 2 Replaced coil 2009-01-02 20:00:04.700 3 1 Replaced coil 2009-01-02 20:00:04.700 4 1 Replaced LED 2002-08-20 20:00:04.700 5 2 Sealed leakage 2007-03-08 20:00:04.700 6 3 Replace connector 2004-05-16 20:00:04.700

Tengo otra tabla que mostrará lo que significa cada ID de pieza, pero ese no es el problema que estoy enfrentando ahora. Estoy obligado a escribir una consulta que devuelva el último mantenimiento hecho en cada parte. Entonces, en este caso, mi resultado esperado sería:

TransactionID Part ID Description Last Updated 2 2 Replaced coil 2009-01-02 20:00:04.700 3 1 Replaced coil 2009-01-02 20:00:04.700 6 3 Replace connector 2004-05-16 20:00:04.700

Explicación: Por ejemplo, el último mantenimiento para la Parte ID # 1 se completó el 2009-01-02 20: 00: 04.700 y así sucesivamente.

He intentado SELECT DISTINCT pero no funcionará porque básicamente todas las filas serán diferentes. Estoy completamente fuera de pista. Y si uso MAX(Last Updated) , solo devolverá una fila de la tabla completa.

Editado: en cualquier caso, NO puedo usar la consulta dinámica.


SELECT TransactionID ,PartID ,[Description] ,[Last Updated] FROM ( SELECT TransactionID ,PartID ,[Description] ,[Last Updated] ,ROW_NUMBER() OVER (PARTITION BY [PartID] ORDER BY [Last Updated] DESC) RN FROM TableName )A WHERE A.RN = 1

O puedes usar CTE

;WITH CTE AS ( SELECT TransactionID ,PartID ,[Description] ,[Last Updated] ,ROW_NUMBER() OVER (PARTITION BY [PartID] ORDER BY [Last Updated] DESC) RN FROM TableName ) SELECT TransactionID ,PartID ,[Description] ,[Last Updated] FROM CTE WHERE A.RN = 1


SELECT t.TransactionID, t.PartID, t.Description, t.LastUpdated FROM History t JOIN (SELECT PartID, MAX(TransactionID) FROM History GROUP BY PartID) t2 ON t.PartID = t2.PartID AND t.TransactionID = t2.TransactionID

también funcionará


select TransactionID, PartID, Description, LastUpdated from History H where LastUpdated = ( select max(LastUpdated) from History where PartID = H.PartID )