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:

Eliminar valores duplicados basa en una única columna de la tabla

¿Cómo puedo eliminar los duplicados en siteName columna? Quiero dejar sólo el uno actualizado basado en date columna.

En el resultado del ejemplo anterior, tengo la necesidad de las filas 1, 3, 6, 10

InformationsquelleAutor Ned | 2013-07-06

2 Comentarios

  1. 26

    Aquí es donde la función de la ventana row_number() viene muy bien:

    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
    • Podría usted explicar la consulta un poco?
    • ¿Sabes lo que row_number() hace? Enumera las filas de un grupo (definido por el partition by cláusula). El pedido se basa en la order by cláusula. Seleccionando el valor de 1, sólo una fila es elegido por el grupo, y que será el que con la mayor fecha.
    • Wow, se llevó a Gordon a 2 min a venir con esta. smh.
  2. 8

    De su ejemplo, parece razonable suponer que la siteIP columna se determina por la siteName columna (es decir, cada sitio tiene sólo una siteIP). Si este es el caso, entonces hay una solución simple de usar 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 web tiene varias siteIP), entonces no es claro a partir de que la pregunta que siteIP desea que la consulta devuelva en la segunda columna. Si cualquier siteIP, a continuación, en la siguiente consulta se va a hacer:

    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;

Dejar respuesta

Please enter your comment!
Please enter your name here