SQL反模式笔记14——关于分组取最大值的问题
2012-05-08 09:11
295 查看
目标:要查询得到每组的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完全可以被抛弃了。
反模式:引用非分组列
如: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完全可以被抛弃了。
相关文章推荐
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 关于JAVA中包装类的是什么类型传递这个问题的笔记
- 【机器学习-斯坦福】学习笔记14 主成分分析(Principal components analysis)-最大方差解释
- Python学习笔记--关于split的分割问题
- 算法笔记1-最大子序列和问题的求解
- 关于“ORA-01000: 超出打开游标的最大数”的问题
- 关于sql语句中top + order by语句出现多提取问题的解决[cherryt笔记]
- 关于SQLServer2005的学习笔记——生日问题
- 关于最大连续子序列问题
- SQL分组求每组最大值问题的解决方法收集 (转载)
- CS229 笔记:关于 Logistic Regression 的六个小问题
- JAVA学习笔记_关于异常机制处理问题
- 关于要求一串数字不超过某个数字可以达到的最大和(DP背包问题)
- [笔记]关于系统字体变化导致APP界面混乱问题
- LeetCode 笔记系列 14 N-Queen II [思考的深度问题]
- RHEL修改最大文件打开数,关于epoll socket Too many open files问题的解决
- iOS开发笔记--关于设置UIView的背景为图片的方法以及问题
- 关于MYSQL group by 分组按时间取最大值的实现方法