2011-03-07 13 views
14

Supongamos que si mi entrada es:Como llegar primer registro de cada grupo a partir del resultado recuperado mediante el uso de grupos por orden

ID GroupID Qty 
1   1 100 
2   1 200 
3   1 300 
4   2 98 
5   2 198 
6   3 175 
7   3 275 
8   3 375 
9   4 215 

de salida debe ser

ID GroupID Qty 
1   1 100 
4   2 98 
6   3 175 
9   4 215 

Puede alguno mí cómo ayudar hacerlo con SQL Server T-SQL consulta?

+0

Podría ser más claro? ¿Entradas a qué? ¿Por qué la salida debería ser así? ¿Estás ingresando a una mesa? Tal vez es solo el formato que no está claro. – Ramy

+0

Defina "Primero". Primero según lo ordenado por qué? ¿'Qty' siempre asciende dentro de un grupo por' id' según los datos de muestra? –

+0

¡Pregunta de alta calidad! Es posible que haya mencionado la versión de SQL Server que está utilizando. –

Respuesta

29
declare @T table (ID int, GroupID int, Qty int) 
insert into @T values 
(1, 1, 100), 
(2, 1, 200), 
(3, 1, 300), 
(4, 2, 98), 
(5, 2, 198), 
(6, 3, 175), 
(7, 3, 275), 
(8, 3, 375), 
(9, 4, 215) 

;with cte as 
(
    select 
    ID, 
    GroupID, 
    Qty, 
    rank() over(partition by GroupID order by ID) as rn 
    from @T 
) 
select ID, GroupID, Qty 
from cte 
where rn = 1 
+0

¡Perfecto! Sin embargo, tuve que cambiar el rango() a ROW_NUMBER() en mi caso. Gracias por cierto. –

+0

Gran respuesta. [CTE] (http://technet.microsoft.com/en-us/library/ms190766 (v = sql.105) .aspx) funciona en MSSQL 2005 y versiones posteriores. No en MSSQL 2000. –

5

EDITAR

SELECT 
    MIN(ID) , 
    GroupID, 
    (SELECT TOP 1 Qty FROM @TABLE T2 WHERE T2.ID = MIN(T1.ID)) 
FROM 
    @TABLE T1 
GROUP BY 
    GroupID 

entrada

ID GroupID Qty 
    1 1 100 
    2 1 200 
    3 1 300 
    4 2 98 
    5 2 198 
    6 3 175 
    7 3 275 
    8 3 375 
    9 4 215 

salida

1 1 100 
4 2 98 
6 3 175 
9 4 215 
0

La forma mejor y más flexible en mi opinión sería utilizar ROW_NUMBER(). El continuación He probado por su ejemplo, basta con sustituir tmpTable con su nombre de la tabla:

SELECT a.* FROM tmpTable a INNER JOIN 
(SELECT ROW_NUMBER() over(PARTITION BY GroupID ORDER BY ID, GroupID) AS SEQ, tmpTable.* 
FROM   tmpTable) b 
ON a.ID = b.ID AND a.GroupID = b.GroupID 
WHERE b.SEQ = 1 

leer más acerca de cómo usar ROW_NUMBER: https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql

Cuestiones relacionadas