tablas registros eliminar duplicados sql sql-server distinct inner-join duplicate-removal

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