Saltar al contenido

SQL Left Join solo en la primera coincidencia

Tenemos el hallazgo a esta incógnita, al menos eso creemos. Si tienes dudas coméntalo, que sin dudarlo te responderemos

Solución:

distinct es no Una función. Siempre opera en todos columnas de la lista de selección.

Su problema es un problema típico de “mayor N por grupo” que se puede resolver fácilmente usando una función de ventana:

select ...
from (
  select IDNo,
         FirstName,
         LastName,
         ....,
         row_number() over (partition by lower(idno) order by firstname) as rn 
  from people 
) t
where rn = 1;

Utilizando el order by puede seleccionar cuál de los duplicados desea elegir.

Lo anterior se puede usar en una combinación izquierda, ver a continuación:

select ...
from x
  left join (
    select IDNo,
           FirstName,
           LastName,
           ....,
           row_number() over (partition by lower(idno) order by firstname) as rn 
    from people 
  ) p on p.idno = x.idno and p.rn = 1
where ...

Agregue una columna de identidad (ID de personas) y luego use una subconsulta correlacionada para devolver el primer valor de cada valor.

SELECT *
FROM People p
WHERE PeopleID = (
    SELECT MIN(PeopleID) 
    FROM People 
    WHERE IDNo = p.IDNo
)

Resulta que lo estaba haciendo mal, necesitaba realizar una selección anidada primero de solo las columnas importantes, y hacer una selección distinta para evitar que las columnas basura de datos ‘únicos’ corrompieran mis datos buenos. Lo siguiente parece haber resuelto el problema… pero probaré con el conjunto de datos completo más tarde.

SELECT DISTINCT P2.*
FROM (
  SELECT
      IDNo
    , FirstName
    , LastName
  FROM people P
) P2

Aquí hay algunos datos de juego solicitados: http://sqlfiddle.com/#!3/050e0d/3

CREATE TABLE people
(
       [entry] int
     , [IDNo] varchar(3)
     , [FirstName] varchar(5)
     , [LastName] varchar(7)
);

INSERT INTO people
    (entry,[IDNo], [FirstName], [LastName])
VALUES
    (1,'uqx', 'bob', 'smith'),
    (2,'abc', 'john', 'willis'),
    (3,'ABC', 'john', 'willis'),
    (4,'aBc', 'john', 'willis'),
    (5,'WTF', 'jeff', 'bridges'),
    (6,'Sss', 'bill', 'doe'),
    (7,'sSs', 'bill', 'doe'),
    (8,'ssS', 'bill', 'doe'),
    (9,'ere', 'sally', 'abby'),
    (10,'wtf', 'jeff', 'bridges')
;

Recuerda que tienes autorización de agregar una reseña .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *