一个表:
学生    科目    成绩
张三    数学    99
张三    语文    80
张三    英语    66
李四    数学    80
李四    语文    88
李四    英语    98
王五    数学    56
王五    语文    65
王五    英语    77
现要查询出各科目最高分的记录:
张三  数学 99
李四  语文 88
李四  英语 98

解决方案 »

  1.   

    select 
      *
    from
      tb t
    where
      not exists(select 1 from tb where 科目=t.科目 and 成绩>t.成绩)
      

  2.   

    SELECT * FROM TB T WHERE NOT EXISTS(SELECT 1 FROM WHERE 科目=T.科目 AND 成绩>T.成绩)
      

  3.   

    ---测试数据---
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([学生] varchar(4),[科目] varchar(4),[成绩] int)
    insert [tb]
    select '张三','数学',99 union all
    select '张三','语文',80 union all
    select '张三','英语',66 union all
    select '李四','数学',80 union all
    select '李四','语文',88 union all
    select '李四','英语',98 union all
    select '王五','数学',56 union all
    select '王五','语文',65 union all
    select '王五','英语',77
     
    ---查询---
    select 
      *
    from
      tb t
    where
      not exists(select 1 from tb where 科目=t.科目 and 成绩>t.成绩)
    ---结果---
    学生   科目   成绩          
    ---- ---- ----------- 
    张三   数学   99
    李四   语文   88
    李四   英语   98(所影响的行数为 3 行)
      

  4.   

    DECLARE @TB TABLE([学生] NVARCHAR(2), [科目] NVARCHAR(2), [成绩] INT)
    INSERT @TB 
    SELECT N'张三', N'数学', 99 UNION ALL 
    SELECT N'张三', N'语文', 80 UNION ALL 
    SELECT N'张三', N'英语', 66 UNION ALL 
    SELECT N'李四', N'数学', 80 UNION ALL 
    SELECT N'李四', N'语文', 88 UNION ALL 
    SELECT N'李四', N'英语', 98 UNION ALL 
    SELECT N'王五', N'数学', 56 UNION ALL 
    SELECT N'王五', N'语文', 65 UNION ALL 
    SELECT N'王五', N'英语', 77SELECT A.*
    FROM @TB AS A JOIN (
    SELECT *,RANK=DENSE_RANK() OVER (PARTITION BY [科目] ORDER BY [成绩] DESC) FROM @TB 
    ) B
    ON A.[学生]=B.[学生] AND A.[科目]=B.[科目] AND A.[成绩]=B.[成绩]
    WHERE RANK=1
    /*
    学生   科目   成绩
    ---- ---- -----------
    张三   数学   99
    李四   语文   88
    李四   英语   98
    */
      

  5.   

    select 学生,科目,成绩 from (select  *,RANK() over (partition by 科目 order by 成绩 desc) rank from tb  )m where rank=1
      

  6.   

    由于存在不分组字段姓名存在,所以不能直接用group by 分组取最大值。可以用联合查询:
    select 
      *
    from
      tb A
    where
      not exists(select * from tb where 科目=A.科目 and 成绩 > A.成绩)
      

  7.   


    create table [TBTEST]([学生] varchar(4),[科目] varchar(4),[成绩] int)
    insert [TBTEST]
    select '张三','数学',99 union all
    select '张三','语文',80 union all
    select '张三','英语',66 union all
    select '李四','数学',80 union all
    select '李四','语文',88 union all
    select '李四','英语',98 union all
    select '王五','数学',56 union all
    select '王五','语文',65 union all
    select '王五','英语',77SELECT T.* FROM TBTEST T ,(SELECT 科目,MAX(成绩) 成绩 FROM TBTEST GROUP BY 科目)AS T1 
    WHERE T.科目=T1.科目 AND T1.成绩=T.成绩 ORDER BY 1 DESC张三 数学 99
    李四 语文 88
    李四 英语 98