sql - registros - Eliminación de valores duplicados basados en una sola columna de la tabla
eliminar registros de 2 tablas mysql (2)
A partir de su ejemplo, parece razonable suponer que la columna siteIP
está determinada por la columna siteName
(es decir, cada sitio tiene solo un siteIP
). Si este es el caso, entonces hay una solución simple usando group by
:
select
sites.siteName,
sites.siteIP,
max(history.date)
from sites
inner join history on
sites.siteName=history.siteName
group by
sites.siteName,
sites.siteIP
order by
sites.siteName;
Sin embargo, si mi suposición no es correcta (es decir, es posible que un sitio tenga múltiples siteIP
), no está claro si pregunta qué siteIP
desea que la consulta regrese en la segunda columna. Si cualquier sitio siteIP
, la siguiente consulta hará:
select
sites.siteName,
min(sites.siteIP),
max(history.date)
from sites
inner join history on
sites.siteName=history.siteName
group by
sites.siteName
order by
sites.siteName;
Mi consulta:
SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
history ON sites.siteName = history.siteName
ORDER BY siteName,date
Primera parte de la salida:
¿Cómo puedo eliminar los duplicados en la columna siteName
? Quiero dejar solo el actualizado en base a la date
columna.
En el ejemplo de salida anterior, necesito las filas 1, 3, 6, 10
Aquí es donde la función de ventana row_number()
es útil:
SELECT s.siteName, s.siteIP, h.date
FROM sites s INNER JOIN
(select h.*, row_number() over (partition by siteName order by date desc) as seqnum
from history h
) h
ON s.siteName = h.siteName and seqnum = 1
ORDER BY s.siteName, h.date