2017-07-12 32 views
0

我有一个表格,其中有超过1000多行,其中有一列“AnaId”,此列的值重复多次,如名称003912重复85次,重复70次名称003156,我想选择每个不同AnaID的最多20行。我不知道该怎么做。只选择每个不同名称的20行

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

格雷亚现在你可以看@GordonLinoff和@ChetanKulkami提供的答案并对其进行修改。 't'在他们的答案中,你可以用你的查询替换。 – Rokuto

+0

在您以问答方式回答无效之后更改问题是无礼的。 –

+0

@GordonLinoff对不起,我认为这也是不必要的发布查询 –

回答

3

您可以使用row_number()

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

随着编辑你的问题,你可以这样做:

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; 

如果您有名称的另一个表,你也可以使用cross apply

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

这个查询中的“t”是什么? –

+0

等级,Dense_Rank也会诡计 –

+0

@SyedSibtainAliShah。 。 。那是给你的桌子。 –

0

使用RANK()

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

使用DENSE_RANK()

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

使用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

基本守则学分: - @戈登