resueltos inner ejercicios ejemplos desde consultas complejas cero aprender agrupadas sql datetime select group-by max

inner - ejemplos de consultas en sql



¿Cómo encontrar el registro en una tabla que contiene el valor máximo? (4)

Esto es precisamente para lo que se hicieron las funciones analíticas:

select group, id, value from ( select group, id, value, date, max(date) over (partition by group) max_date_by_group from A ) where date = max_date_by_group

Aunque esta pregunta parece simple, es un poco complicado.

Tengo una tabla con las siguientes columnas:

table A: int ID float value datetime date varchar(50) group

Me gustaría obtener el "ID" y el "valor" de los registros que contienen la "fecha" máxima agrupada por la columna "grupo". Algo así como "¿cuál es el valor más nuevo para cada grupo?"

Puedo obtener cada grupo y su fecha máxima:

SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"

Pero me gustaría tener la "ID" y el valor del registro con la fecha más alta.

Hacer una JOIN entre A y el resultado podría ser la respuesta, pero no hay manera de saber a qué registro se refiere MAX (fecha) (en caso de que se repita la "fecha").

¿Alguien puede ayudar?


Puedes intentar con una subconsulta

select group, id, value, date from A where date in ( select MAX(date) as date from A group by group ) order by group


Si la fecha es única, entonces ya tiene su respuesta. Si la fecha no es única, entonces necesita algún otro elemento único. En ausencia de una clave natural, su identificación es tan buena como cualquiera. Simplemente ponga un MAX (o MIN, lo que prefiera) en él:

SELECT * FROM A JOIN ( --Dedupe any non unqiue dates by getting the max id for each group that has the max date SELECT Group, MAX(Id) as Id FROM A JOIN ( --Get max date for each group SELECT group, MAX(date) as Date FROM A GROUP BY group ) as MaxDate ON A.Group = MaxDate.Group AND A.Date = MaxDate.Date GROUP BY Group ) as MaxId ON A.Group = MaxId.Group AND A.Id= MaxId.Id


Siempre que la columna Fecha sea única para cada grupo, creo que algo así podría funcionar:

SELECT A.ID, A.Value FROM A INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B ON A.Group = B.Group AND A.Date = B.MaxDate