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完全可以被抛弃了。
反模式:引用非分组列
如: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完全可以被抛弃了。
相关文章推荐
- sql查询语句,求每个分组中的最大值实例
- 先分组查询,然后为每组数据排序,取出最大值
- Oracle SQL查询每组中某个字段最大的那笔资料
- [VB.NET]用SQL查询得到(按编号分组的日期最大的记录)
- SQL 按字段分组后取每组内最大或最小的值
- sql查询语句,求每个分组中的最大值实例
- sql 分组查询 分组查询查询每组的前几条数据
- sql 分组后查询最大所有列信息
- sql语句:查询分组统计并计算每组数量
- oracle sql 按某个字段分组然后从每组取出最大的一条纪录
- 【Oracle】oracle sql 按某个字段分组然后从每组取出最大的一条纪录
- SQL 先分组后排序 然后每组取最大一行
- SQL分组查询每组前几条数据
- sql分组查询最大值或最小值
- SQL分组求每组最大值问题的解决方法收集 (转载)
- SQL按天进行分组查询最大值和最小值
- sql分组查询每组的第一条记录
- 数据库排名sql,group by 分组查询按照时间最大值
- SQL查询得到(按编号分组的日期最大的记录)
- sql查询语句,求每个分组中的最大值实例