Select top 10 records for each category

前端 未结 14 1484
别那么骄傲
别那么骄傲 2020-11-22 04:27

I want to return top 10 records from each section in one query. Can anyone help with how to do it? Section is one of the columns in the table.

Database is SQL Serve

14条回答
  •  说谎
    说谎 (楼主)
    2020-11-22 05:11

    If we use SQL Server >= 2005, then we can solve the task with one select only:

    declare @t table (
        Id      int ,
        Section int,
        Moment  date
    );
    
    insert into @t values
    (   1   ,   1   , '2014-01-01'),
    (   2   ,   1   , '2014-01-02'),
    (   3   ,   1   , '2014-01-03'),
    (   4   ,   1   , '2014-01-04'),
    (   5   ,   1   , '2014-01-05'),
    
    (   6   ,   2   , '2014-02-06'),
    (   7   ,   2   , '2014-02-07'),
    (   8   ,   2   , '2014-02-08'),
    (   9   ,   2   , '2014-02-09'),
    (   10  ,   2   , '2014-02-10'),
    
    (   11  ,   3   , '2014-03-11'),
    (   12  ,   3   , '2014-03-12'),
    (   13  ,   3   , '2014-03-13'),
    (   14  ,   3   , '2014-03-14'),
    (   15  ,   3   , '2014-03-15');
    
    
    -- TWO earliest records in each Section
    
    select top 1 with ties
        Id, Section, Moment 
    from
        @t
    order by 
        case 
            when row_number() over(partition by Section order by Moment) <= 2 
            then 0 
            else 1 
        end;
    
    
    -- THREE earliest records in each Section
    
    select top 1 with ties
        Id, Section, Moment 
    from
        @t
    order by 
        case 
            when row_number() over(partition by Section order by Moment) <= 3 
            then 0 
            else 1 
        end;
    
    
    -- three LATEST records in each Section
    
    select top 1 with ties
        Id, Section, Moment 
    from
        @t
    order by 
        case 
            when row_number() over(partition by Section order by Moment desc) <= 3 
            then 0 
            else 1 
        end;
    

提交回复
热议问题