注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

sql 分组不一定要group by  

2013-09-24 09:38:51|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天在公司写代码的时候,遇到一个sql语句构建问题。

情形是这样的:

我需要获取不同小组下前N条记录。

select top 10 * from dbo.Topic where GroupID in (60034,60037) and State=0  order by CrtTime desc

很明显,这是错的,不仅没group by,获取出来的还是按两个小组的创建时间的前10条数据。

可是,用group by的话,它有个很不通人性的特性。即是——凡是在group by后面出现的字段,必须同时在select后面出现;凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面。

这样就让我不得不放弃使用group by来分组查询。

后来在网上找到,分组,不一定要用group by来实现。用row_number() over()同样可以实现。

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

有了这么一个函数存在,最终我构建了我的sql语句:

select *
from
(
select *,row_number() over (partition by GroupID order by CrtTime desc) rank from Topic where State=0
) T
where T.rank<=10 and T.GroupID in(60034,60040) 

实现了这么一个功能:从不同的组别(60034,60040)里获取到了按创建时间降序排序的各个小组里的前10条记录。

参考文章:sql查询-分组

     SQL ROW_NUMBER() OVER函数的基本用法用法

转自:http://www.cnblogs.com/dieaz5/p/3335778.html

  评论这张
 
阅读(328)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017