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 .