您的位置:首页 > 数据库

sql分组查询每组的最大值

2013-05-24 15:07 337 查看
目标:要查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段

反模式:引用非分组列

  如:select articleid,max(tagid),tagname

  from articleTag

  group by articleid

这一章有点搞,因为这一章的目标用group去实现,根本就是个错误(mssql是这样),语法就不对!

mssql里用row_number就行了,如果不用group就很麻烦了,比如有一个people表,里面有firstname、lastname、age几个字段,现在想得到每个firstname分组里年龄最大的人的lastname

用row_number如下:

  select firstname,lastname,age

  from (

    select ROW_NUMBER() over(partition by firstname order by age desc,id asc) as number,*

    from people

  ) x where number=1

用group如下:

  select a.firstname,a.lastname,a.age

  from people a

  join(--根据得到的最大年龄,找其年龄符合的数据,为了避免年龄重复,再对其分组,取最小的id

    select MIN(p1.id) as minId

    from people p1

    join(--得到每个firstname的最大年龄

      select firstname,MAX(age) as maxAge

      from people

      group by firstname

    ) p2 on p1.firstname=p2.firstname and p1.age=p2.maxAge

    group by p1.firstname,p1.age

  )b on a.id=b.minId

对比一下就知道,group完全可以被抛弃了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: