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完全可以被抛弃了。