2009-10-29 9 views
41

Cuando realizo "SELECT * FROM tabla" Me resultados como a continuación:Cómo seleccionar registros únicos por SQL

1 item1 data1 
2 item1 data2 
3 item2 data3 
4 item3 data4 

Como se puede ver, hay registros duplicados de columna2 (elemento1 están dupped). Entonces, ¿cómo podría obtener sólo resultado como este:

1 item1 data1 
2 item2 data3 
3 item3 data4 

Sólo un registro se devuelven desde el duplicado, junto con el resto de los registros únicos.

Respuesta

58

Puede usar SELECT DISTINCT o GROUP BY para hacerlo.

SELECT DISTINCT a, c 
FROM table_c 

o

SELECT a, b 
FROM table_c 
GROUP BY a, b 

GROUP BY será más útil si se desea utilizar alguna función agregada como COUNT() o SUM()

SELECT a, b, count(*) 
FROM table_c 
GROUP BY a, b 

SELECT a, b, sum(d) 
FROM table_c 
GROUP BY a, b 
+0

¿Puede ser que la respuesta sea realmente incorrecta? DISTINCT se aplica a todas las columnas seleccionadas (al menos en un DB2), que aún devolverá valores duplicados en columnas individuales. – Konstantin

19

Si sólo necesita para eliminar duplicados a continuación, utilizar DISTINCT. GROUP BY deben utilizarse para aplicar operadores globales para cada grupo

GROUP BY v DISTINCT

6

Depende de qué Rown desea volver para cada artículo único. Sus datos parecen indicar el valor de datos mínimo, por lo que en este caso para SQL Server.

SELECT item, min(data) 
FROM table 
GROUP BY item 
1

Creo que si no puedo usar DISTINCT por algún motivo, entonces GROUP BY funcionará.

0

para obtener todas las columnas en el resultado que necesita para colocar algo como:

SELECT distinct a, Table.* FROM Table 

se colocará un como la primera columna y el resto será todo de las columnas en el mismo orden que tu definición Esto es, se repetirá la columna a.

+1

¿Estás seguro de esto?Intenté esto en w3schools y me devolvió lo mismo que SELECT *, excepto que fue la primera columna – Freakishly

+0

@Freakishly yes y eso es exactamente lo que dice que va a hacer en mi respuesta:/ – htafoya

+0

Esto no funcionará, no puede seleccionar * después de ese distinto (obtendrá un error 1064 - Error en su sintaxis SQL) –

-3

Select Eff_st de ( seleccione EFF_ST, ROW_NUMBER() sobre (partición POR eff_st) XYZ - de ABC.CODE_DIM

) donde XYZ = 1 orden por EFF_ST traiga primero 5 solamente fila

0

simplemente use la unión interna porque group by no funcionará con varias columnas que digan que no están contenidas en una función de agregado.

SELECT a.* 
FROM yourtable a 
INNER JOIN 
    (SELECT yourcolumn, 
    MIN(id) as id 
    FROM yourtable 
    GROUP BY yourcolumn 
) AS b 
    ON a.yourcolumn= b.yourcolumn 
    AND a.id = b.id; 
+0

Esa es la respuesta a una pregunta diferente, probablemente una que debe etiquetarse con [etiqueta: greatest-n-per-group] –

Cuestiones relacionadas