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