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