SQL: sélection de l'logging supérieur pour un groupe de colonnes

Je dois sélectionner l'logging supérieur avec la valeur maximale pour un groupe d'autres colonnes. Dans les exemples de données ci-dessous, je dois sélectionner l'logging supérieur avec le maximum de 'Weightage' pour chaque groupe de 'id', 'ItemType'

create table sampleTable(id int, ItemType varchar(10), ItemCode varchar(10), Weightage int) insert into sampleTable values(1, 'A','aaa',2) insert into sampleTable values(1, 'A','bbb',3) insert into sampleTable values(1, 'A','ccc',3) insert into sampleTable values(1, 'B','ddd',1) insert into sampleTable values(1, 'B','eee',2) insert into sampleTable values(2, 'A','aaa',1) 

La production attendue devrait être

 id ItemType ItemCode -------------------------------- 1 A bbb 1 B eee 2 A aaa 

J'ai essayé comme suit

 SELECT top 1 id, ItemType,ItemCode FROM sampleTable WITH(NOLOCK) GROUP BY id,ItemType,ItemCode,Weightage ORDER BY Weightage desc 

Mais ce n'est pas donner le résultat attendu. Merci

Voici une façon d'utiliser ROW_NUMBER

 SELECT TOP 1 WITH ties id, itemtype, itemcode FROM sampletable WITH(nolock) GROUP BY id, itemtype, itemcode, weightage ORDER BY Row_number()OVER(partition BY id, itemtype ORDER BY weightage DESC) 

TOP 1 with TIES returnnera les loggings avec Tie en fonction de l' Order by

J'espère que vous connaissez la signification de l'utilisation de WITH(NOLOCK) hint . Il va aussi tirer des données non validées

Voici une option utilisant row_number() :

 select * from ( select *, row_number() over (partition by id, itemtype order by Weightage desc) rn from sampletable ) t where rn = 1 
  • Démo de Fiddle SQL