SQL反模式笔记14——关于分组取最大值的问题

目标:要查询得到每组的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完全可以被抛弃了。

posted @ 2012-05-08 09:11  日暮乡关何处是  阅读(945)  评论(0编辑  收藏  举报