2010-08-19 58 views
7

Tengo una tabla con 10 columnas. Quiero devolver todas las filas para las cuales Col006 es distinto, pero devuelvo todas las columnas ...Seleccionar DISTINCT, devolver toda la fila

¿Cómo puedo hacer esto?

si la columna 6 aparece así:

| Column 6 | 
| item1 | 
| item1 | 
| item2 | 
| item1 | 

quiero volver dos filas, uno de los discos con elemento1 y el otro con elemento2, junto con todas las demás columnas.

+0

"Col006 is distinct" - ¿en comparación con qué? –

+0

COL006 tiene un valor por lo que es distinto donde sea que aparezca. ¿De verdad quieres decir "SELECCIONE COLOCAR DISTINTO DE LA PESTAÑA CUENTA (*) = 1"? –

+0

En realidad, ¿qué quieres decir con eso, exactamente? – NinjaCat

Respuesta

9

En SQL Server 2005 y superiores:

;WITH q AS 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY col6 ORDER BY id) rn 
     FROM mytable 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 

En SQL Server 2000, siempre y cuando tenga una columna de clave principal:

SELECT mt.* 
FROM (
     SELECT DISTINCT col6 
     FROM mytable 
     ) mto 
JOIN mytable mt 
ON  mt.id = 
     (
     SELECT TOP 1 id 
     FROM mytable mti 
     WHERE mti.col6 = mto.col6 
     -- ORDER BY 
     --  id 
     -- Uncomment the lines above if the order matters 
     ) 

Actualización:

Compruebe su base de datos de versión y nivel de compatibilidad:

SELECT @@VERSION 

SELECT COMPATIBILITY_LEVEL 
FROM sys.databases 
WHERE name = DB_NAME() 
+0

Eso me da: Servidor: Msg 156, Nivel 15, Estado 1, Línea 2 Sintaxis incorrecta cerca de la palabra clave 'CON'. Servidor: Msg 195, nivel 15, estado 1, línea 4 'ROW_NUMBER' no es un nombre de función reconocido. – NinjaCat

+0

@NinjaCat: ¿qué versión de 'SQL Server' estás usando? – Quassnoi

+0

MS SQL Server 2005 – NinjaCat

-1
create table #temp 
(C1 TINYINT, 
C2 TINYINT, 
C3 TINYINT, 
C4 TINYINT, 
C5 TINYINT, 
C6 TINYINT) 

INSERT INTO #temp 
SELECT 1,1,1,1,1,6 
UNION ALL SELECT 1,1,1,1,1,6 
UNION ALL SELECT 3,1,1,1,1,3 
UNION ALL SELECT 4,2,1,1,1,6 

SELECT * FROM #temp 

SELECT * 
FROM(
SELECT ROW_NUMBER() OVER (PARTITION BY C6 Order by C1) ID,* FROM #temp 
)T 
WHERE ID = 1 
+1

Esto devuelve todos los registros también ... Usando MS SQLServer, y el campo es varchar (255) – NinjaCat

+0

el temptable tiene 1500 registros (fuera de los 10000 registros originales). – NinjaCat

+1

Eso hace lo mismo que simplemente 'select * from table'. – Guffa

2

La palabra clave "DISTINCT" en SQL tiene el significado de "valor único". Cuando se aplica a una columna en una consulta, devolverá tantas filas del conjunto de resultados como valores únicos y diferentes para esa columna. Como consecuencia, crea un conjunto de resultados agrupados, y los valores de otras columnas son aleatorios a menos que estén definidos por otras funciones (como max, min, promedio, etc.)

Si quiere decir que desea devolver todas las filas para que Col006 tiene un valor específico, luego use la cláusula "where Col006 = value".

Si quiere decir que desea devolver todas las filas para las cuales Col006 es diferente de todos los demás valores de Col006, entonces aún necesita especificar qué valor = = ver más arriba.

Si quiere decir que el valor de Col006 solo se puede evaluar una vez que se hayan recuperado todas las filas, utilice la cláusula "having Col006 = value". Esto tiene el mismo efecto que la cláusula "where", pero "where" se aplica cuando las filas se recuperan de las tablas sin formato, mientras que "having" se aplica una vez que se han realizado todos los demás cálculos (es decir, se han ejecutado funciones de agregación, etc.) y justo antes de que el conjunto de resultados sea devuelto al usuario.

ACTUALIZACIÓN:

Después de haber visto su edición, tengo que señalar que si se utiliza cualquiera de las otras sugerencias, el resultado final será con valores aleatorios en todas las otras 9 columnas de la fila que contiene el valor "item1" en Col006, debido a la restricción más arriba en mi publicación.

+0

Sí, la aleatoriedad no es un problema en este caso .... – NinjaCat

+2

No me importa qué valor único de col006 ... Solo necesito una instancia. Pero hay más de 5000 valores diferentes para col006. ¿Cómo especifico eso? – NinjaCat

1

Puede agrupar en Col006 para obtener los valores distintos, pero luego debe decidir qué hacer con los registros múltiples en cada grupo.

Puede usar agregados para elegir un valor de los registros. Ejemplo:

select Col006, min(Col001), max(Col002) 
from TheTable 
group by Col006 
order by Col006 

Si desea que los valores que provienen de un registro específico de cada grupo, usted tiene que identificar de alguna manera.Ejemplo de uso de Col002 para identificar el registro en cada grupo:

select Col006, Col001, Col002 
from TheTable t 
inner join (
    select Col006, min(Col002) 
    from TheTable 
    group by Col006 
) x on t.Col006 = x.Col006 and t.Col002 = x.Col002 
order by Col006 
0
SELECT * 
FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A 
CROSS APPLY 
(SELECT TOP 1 * FROM YourTable B 
    WHERE B.YourDistinctField = A.YourDistinctField) AS NewTableName 

probé las respuestas publicadas anteriormente sin suerte ... pero esto hace el truco!

0
select * from yourTable where column6 in (select distinct column6 from yourTable); 
0

Puede utilizar GROUP BY y MIN() para obtener el resultado.

Digamos que usted tiene id como primary_key. Y queremos obtener todos los valores DISTINCT para una columna digamos estimated_total, Y también necesita una muestra de la fila completa con cada valor distinto en SQL. La siguiente consulta debería hacer el truco.

SELECT *, min(id) 
FROM harvest 
GROUP BY estimated_total; 
Cuestiones relacionadas