【问题标题】:Get first row for one group [closed]获取一组的第一行[关闭]
【发布时间】:2012-02-15 02:29:26
【问题描述】:

我想获取每个 GV(TeacherID) 的第一行

GV |   Class|  SUM 
GV1|   L001 |  5000 
GV1|   L002 |  5000 
GV1|   L003 |  5000 
GV2|   L002 |  7000 
GV2|   L003 |  7000 
GV2|   L001 |  7000 
GV3|   L001 |  8000 
GV3|   L002 |  8000 
GV3|   L003 |  8000 

帮帮我。

【问题讨论】:

    标签: sql sql-server sql-server-2008 greatest-n-per-group


    【解决方案1】:

    编辑:好的,现在你已经编辑了这个问题,这个答案看起来完全无关紧要......叹息......我会留下它以防它帮助你开始。干杯。


    根据您的规格,最简单的解决方案:

      select teacherid 
        from mytable 
    group by teacherid;
    

    如果您需要teacherid以外的其他信息:

      select teacherid, ...other cols...
        from (select teacherid, ...other cols...
                     row_number() over (
                         partition by teacherid
                         order by classid /* or class as per edit */) as row_num
                from mytable) my_derived_table
       where my_derived_table.row_num = 1;
    

    警告:我没有安装 SQL-Server 来方便测试,所以语法可能不完全正确;但它很接近。

    【讨论】:

    • 非常感谢。但是方法 2 是我需要的。
    【解决方案2】:
    WITH T AS (
        SELECT yourTable.*, ROW_NUMBER() OVER(PARTITION BY TeacherID 
          ORDER BY ClassID) AS RN
        FROM yourTable 
    )
    SELECT * 
    FROM T
    WHERE RN = 1
    

    【讨论】:

    • 很有趣。非常感谢
    【解决方案3】:

    DDL

    create table #t
    (
        GV  varchar(4),
        Class varchar(4),
        [SUM] int
    )
    

    样本记录

    insert into #t(GV, Class, [SUM])values('GV1', 'L001', 5000)
    insert into #t(GV, Class, [SUM])values('GV1', 'L002', 5000)
    insert into #t(GV, Class, [SUM])values('GV1', 'L003', 5000)
    insert into #t(GV, Class, [SUM])values('GV2', 'L002', 7000)
    insert into #t(GV, Class, [SUM])values('GV2', 'L003', 7000)
    insert into #t(GV, Class, [SUM])values('GV2', 'L001', 7000)
    insert into #t(GV, Class, [SUM])values('GV3', 'L001', 8000)
    insert into #t(GV, Class, [SUM])values('GV3', 'L002', 8000)
    insert into #t(GV, Class, [SUM])values('GV3', 'L003', 8000)
    

    查询

    Select GV, class, [sum] from
    (
        Select Row_Number() Over(Partition by GV Order by GV ) as RowId, * from #t
    )K
    Where RowId = 1
    
    drop table #t
    

    结果集

    GV   class sum
    ---- ----- ----
    GV1  L001  5000
    GV2  L002  7000
    GV3  L001  8000
    

    【讨论】:

    • 如果解决了您的问题,请将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2013-02-05
    • 1970-01-01
    • 2016-09-08
    • 2020-02-11
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多