2017-07-12 1 views
0

J'ai une table dans laquelle j'ai plus de 1000 lignes, dans lequel il y a une colonne "AnaId", les valeurs de cette colonne sont répétées plusieurs fois comme le nom 003912 est répété 85 fois, nom 003156 dans 70 fois répété, je veux sélectionner maximum 20 lignes de chaque AnaID distinct. Je n'ai aucune idée de comment le faire.Sélectionnez seulement 20 lignes de chaque nom distinct

SELECT dbo.Analysis.AnaId, Analysis.CasNo, MoleculeId, 

    SUM(dbo.AnalysisSummary.Area) as TotalArea 

    FROM dbo.Analysis LEFT JOIN dbo.AnalysisSummary 

    ON dbo.AnalysisSummary.AnaId = dbo.Analysis.AnaId 

    WHERE dbo.Analysis.Sample like '%Oil%' 

    GROUP BY dbo.Analysis.AnaId,Analysis.CasNo, MoleculeId ORDER BY 

    TotalArea DESC 
+0

Grea t, maintenant vous pouvez regarder les réponses fournies par @GordonLinoff et @ChetanKulkami et l'adapter. 't' dans leurs réponses, vous pouvez remplacer avec votre requête. – Rokuto

+0

Il est impoli de changer les questions après les avoir posées de manière à invalider les réponses. –

+0

@GordonLinoff Désolé, je pensais qu'il n'est pas nécessaire de poster une requête aussi –

Répondre

3

Vous pouvez utiliser row_number():

select t.* 
from (select t.*, row_number() over (partition by name order by name) as seqnum 
     from t 
    ) t 
where seqnum <= 20; 

Avec les modifications à votre question, vous pouvez le faire:

with t as (
     <your query here without order by> 
    ) 
    select t.* 
    from (select t.*, row_number() over (partition by name order by name) as seqnum 
      from t 
     ) t 
    where seqnum <= 20; 

Si vous avez une autre table de noms, vous pouvez également utiliser cross apply :

select t.* 
from names n cross apply 
    (select top 20 t.* 
     from t 
     where t.name = n.name 
    ) t; 
+0

Qu'est-ce que c'est «t» dans cette requête? –

+0

rang, Dense_Rank fera également l'affaire –

+0

@SyedSibtainAliShah. . . C'est pour votre table. –

0

Utiliser Rank()

select t.* 
from (select t.*, rank() over (partition by name order by name) as seqnum 
     from t 
    ) t 
where seqnum <= 20; 

aide DENSE_RANK()

select t.* 
from (select t.*, Dense_Rank() over (partition by name order by name) as seqnum 
     from t 
    ) t 
where seqnum <= 20; 

En utilisant ROW_NUMBER

select t.* 
    from (select t.*, row_number() over (partition by name order by name) as seqnum 
      from t 
     ) t 
    where seqnum <= 20; 

This will help uunderstand usage of each Special Functions

Code de base Crédits: - @ gordon