Digamos que tengo una tabla de direcciones de clientes:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
En la tabla, un cliente como John Smith puede tener varias direcciones. Necesito que la consulta de selección para esta tabla devuelva solo la primera fila encontrada donde hay duplicados en 'CName'. Para esta tabla, debe devolver todas las filas excepto la tercera (o la primera; cualquiera de esas dos direcciones está bien, pero solo se puede devolver una). ¿Hay una palabra clave que pueda agregar a la consulta SELECT para filtrar en función de si el servidor ya ha visto el valor de la columna antes?
En SQL 2k5 +, puede hacer algo como:
fuente
Puede usar
row_number()
para obtener el número de fila de la fila. Utiliza elover
comando: lapartition by
cláusula especifica cuándo reiniciar la numeración yorder by
selecciona en qué ordenar el número de fila. Incluso si agrega unorder by
al final de su consulta, conservará el orden en elover
comando al numerar.fuente
ROW_NUMBER()
no funciona enWhere
cláusula en Teradata tambiénPuedes usar la
row_numer() over(partition by ...)
sintaxis así:Lo que hace esto es que crea una columna llamada
row
, que es un contador que aumenta cada vez que ve lo mismoCName
, e indexa esas ocurrencias porAddressLine
. Al imponerwhere row = 1
, uno puede seleccionarCName
quiénAddressLine
viene primero alfabéticamente. Siorder by
eradesc
, entonces elegiríaCName
quiénAddressLine
viene en último lugar alfabéticamente.fuente
Esto le dará una fila de cada fila duplicada. También le dará las columnas de tipo bit, y funciona al menos en MS Sql Server.
Si desea encontrar todos los duplicados, simplemente cambie rn = 1 a rn> 1. Espero que esto ayude
fuente