SQL Server: comment sélectionner les 2 meilleurs loggings du même groupe?

J'utilise SQL Server 2008. J'ai un problème où j'ai besoin d'get les 2 meilleurs loggings dans un groupe déterminé par 2 colonnes Code et Period , qui seront ensuite insérés dans une autre table.

Voici un exemple de tableau:

 Code | Period | Dept | DeptWorkPartSum 001 2013-11 D1 53 001 2013-11 D2 33 001 2013-11 D3 12 002 2013-11 D2 30 002 2013-11 D4 28 002 2013-11 D5 15 002 2013-12 D2 100 

Et ce que je veux en tirer est:

 Code | Period | Dept | DeptWorkPartSum 001 2013-11 D1 53 001 2013-11 D2 33 002 2013-11 D2 30 002 2013-11 D4 28 002 2013-12 D2 100 

C'est probablement une solution très simple mais je ne peux pas la comprendre pour le moment.

Une approche simple utilise une fonction de classment CTE avec ROW_NUMBER :

 WITH CTE AS ( SELECT Code,Period,Dept,DeptWorkPartSum, RN = ROW_NUMBER() OVER (PARTITION BY Code,Period, Dept ORDER BY DeptWorkPartSum) FROM dbo.TableName ) SELECT Code,Period,Dept,DeptWorkPartSum FROM CTE WHERE RN <= 2 

Démo

Cependant, votre résultat désiré semble être incorrect puisque le Dept est différent pour les trois codes.

Peut-être que vous ne voulez pas grouper par Dept mais l'ordonner, alors le résultat est correct:

 WITH CTE AS ( SELECT Code,Period,Dept,DeptWorkPartSum, RN = ROW_NUMBER() OVER (PARTITION BY Code,Period ORDER BY Dept, DeptWorkPartSum) FROM dbo.TableName ) SELECT Code,Period,Dept,DeptWorkPartSum FROM CTE WHERE RN <= 2 

Démo

 SELECT Code, Period, Dept, DeptWorkPartSum FROM ( SELECT Code, Period, Dept, DeptWorkPartSum ,ROW_NUMBER ( ) OVER ( PARTITION BY Code, Period, Dept ORDER BY DeptWorkPartSum DESC) r FROM table) q WHERE r <= 2 
 try this: with cte as ( select *,ROW_NUMBER() over (partition by Code,Period,Dept order by Code) as rn from table ) select Code,Period,Dept,DeptWorkPartSum from cte where rn<=2 

démo de violon