2012-02-15 8 views
6

tengo una tabla con nombre que customer_age loks como esto:SQL SELECT desde múltiples registros sólo el más reciente

ID  1 2 3  4  5 6  7  8  9 

NAME JIM JIM JIM NICK NICK NICK Paul Paul Paul          
VALUE 20 13 12 10 20 8  4  24 14 

y quiero mostrar sólo el primer registro de cada nombre. Algo como esto

ID  1  4  7  

NAME JIM NICK Paul         
VALUE 20 10  4  

Hasta ahora no he podido resolverlo. uso sql server 2005 Cualquier ayuda sería apreciada ...

+7

Supongo que "primer registro" es el que tiene el ID más bajo? –

Respuesta

13

Trate de usar una subselección para encontrar el ID más bajo para cada nombre, y utilizar ese conjunto de ID para tirar de los registros de la tabla principal:

SELECT ID, Name, Value 
FROM customer_age 
WHERE ID IN 
(
    SELECT MIN(ID) AS ID 
    FROM customer_age 
    GROUP BY Name 
) 
1

Asumiendo que el primer registro significa la ID más alta, puede intentar su consulta con orden descendente por ID y TOP n.

1

Simplemente seleccione el primer registro para cada nombre mediante cross apply:

SELECT 
ca.ID, ca.NAME, ca.VALUE 
FROM customer_age c 
CROSS APPLY (SELECT TOP 1 ID, NAME, VALUE 
     FROM customer_age ca 
     WHERE ca.NAME = c.NAME ORDER BY ID) ca 
ORDER BY ca.ID 
+0

Esto arroja resultados repetidos, 3 filas en la combinación customer_age con la fila 1 devuelta desde la aplicación. – Umair

2

¿Qué le parece usar las funciones de ventana?

SELECT Id, Name, Value 
FROM (
    SELECT Id, Name, Value, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Id ASC) AS rowNum 
    FROM customer_age 
) AS sub 
WHERE rowNum = 1 
Cuestiones relacionadas