Mi tabla es como la siguiente:

Id  Data   Date 
A   abc    2016-10-01 00:00:00
A   def    2015-05-20 00:00:00
B   xyz    2014-05-20 00:00:00
B   uvw    2016-10-01 00:00:00
B   rst    2015-10-01 00:00:00

Necesito obtener la última fila insertada por ID de columna. Entonces la salida esperada será:

Id  Data   Date
A   def    2015-05-20 00:00:00
B   rst    2015-10-01 00:00:00

Puedo obtener la última fila insertada por la columna Identidad o por la columna de fecha insertada si es así. Pero, ¿cómo obtener la última fila insertada sin estas columnas?

1
good-to-know 22 sep. 2016 a las 15:01

4 respuestas

La mejor respuesta

row_number() es la forma típica de hacer esto:

select t.*
from (select t.*,
             row_number() over (partition by id order by date desc) as seqnum
      from t
     ) t
where seqnum = 1;
4
Gordon Linoff 22 sep. 2016 a las 12:04
Select * 
from table t1
where date = (Select max(date)
    from table t2
    where t2.id = t1.id)
0
Nik 22 nov. 2017 a las 02:01

Aquí hay una forma indocumentada:

Equivalente del RowID de Oracle en SQL Server

Si realmente necesita usar el número de fila, use una columna de identidad.

0
Community 23 may. 2017 a las 11:53

Utilice PARTICIÓN POR Y PEDIDO POR CON ROW_NUMBER () :

;With T AS 
(
    SELECT
        T1.*,
        T2.NoOfCount,
        ROW_NUMBER() OVER(PARTITION BY T1.Id ORDER BY T1.Id DESC) AS PartNo
    FROM @tblTest T1
    LEFT JOIN (
        SELECT
            ID, COUNT(*) AS NoOfCount       
        FROM @tblTest
        GROUP BY ID
    ) T2 ON T1.ID=T2.ID
)
SELECT
    T.ID,
    T.Data,
    T.Date
FROM T 
WHERE T.PartNo=T.NoOfCount

O

;With T AS 
(
    SELECT
        T1.*,           
        ROW_NUMBER() OVER(PARTITION BY T1.Id ORDER BY T1.Id DESC) AS PartNo
    FROM @tblTest T1        
),
W AS
(
    SELECT
        ID, COUNT(*) AS NoOfCount       
    FROM @tblTest
    GROUP BY ID
)
SELECT 
    T.ID,
    T.Data,
    T.Date
FROM T
LEFT JOIN W ON T.ID=W.ID
WHERE T.PartNo=W.NoOfCount

Salida:

enter image description here

1
Sandip - Full Stack Developer 22 sep. 2016 a las 12:18