group by 函数主要用来对数据进行分组,over()函数则是一个“开窗函数”,它更多的是与聚合函数如:sum()、max()、min()、avg()、count()等函数以及排名函数如:row_number()、rank()、dense_rank()、ntile()函数结合使用。

1.group by 函数

原始数据如下,数据表名为hr.employeee

对以上数据按照city字段进行分组,并计算了每组中存在的行数:

 select city,count(city)as n
from hr.employeee
group by city;

分组结果:

根据以上结果,London这个值在原始数据中出现了4次,该组的行数为4。

2.over()函数

一般来说,当使用了group by 进行分组查询,select查询阶段出现的columnlists如果没有出现在group by 后作为分组依据,就必须被包含在聚合函数中。但是往往在书写的时候就会忘记这个限制。over()函数则很好的解决了这个问题,该函数能够实现分组的效果。

原始数据如下(总共有830行):

进行以下查询:

select distinct val,row_number()over(order by val)as rownum
from sales.ordervalues

运行结果仍然是830行,但实际该数据是存在5行的重复数据,所以说,明明在select阶段使用distinct取不同值,为何会没作用呢???

T-SQL语言基础这本书是这样解释的:row_number函数是在distinct子句之前处理的,当其为数据分配了唯一的行号后,再处理distinct子句,所以这时不会有任何重复的行。 (还未理解透,distinct是对val做处理,只要val存在重复值就剔除呀,难道不是这样的吗?--因为distinct是对其后的两列数据进行去重的!)

这也说明,在同一select子句中不能同时使用distinct和row_number()函数,因为distinct会失效!!!

要想得到不含重复值的数据,可以进行以下查询:

select  val,row_number()over(order by val)as rownum
from sales.ordervalues
group by val;

这个时候就筛除了5行重复数据。

以下情形值得注意:

--代码1
--分组之后计算每组的行数
select val,count(val)as n
from sales.ordervalues
group by val;--注意查看分组后val值,这时已经达到去重的效果了
--代码2
--利用over函数达到分组效果,partition by对某列字段分区
select val,count(val)over(partition by val )as num
from sales.ordervalues --代码3
--代码2和3进行对比,注意区别
select val,count(val)over(partition by val )as num
from sales.ordervalues
group by val;

代码1:利用group by 子句进行分组查询,并计算了每组的行数,观察结果发现,group by起到了去重的功效。

代码2:利用over函数达到分组效果,partition by对某列字段分区,并计算分区后每组的行数,这种情况下并没有去重的效果。

代码3:由于group by 处理顺序优于select,前面说到group by具有去重功效,每组数据只有唯一值!因此再进行over函数计算每组行数只有一个结果。

再来一组查询对比,当在over函数中同时指定partition by 和order by 的字段为同一个时,排序失效:

--按照val降序排列失效!!!
select val,count(val)over(partition by val order by val desc )as num
from sales.ordervalues; select val,count(val)over(partition by val )as num
from sales.ordervalues
order by val desc ;

以上按照val降序排列失效的原因在于,partition by 分区后的数据即按照了一定的顺序(升序)排列了,再使用order by 排序就会失效(个人理解):

select  val
from sales.ordervalues select val
from sales.ordervalues
group by val;

以上对比查询看到,group by不仅具有去重功效,还有按照升序排列数据的功能(单列数据查询)。

sqlserver之group by 与over函数的更多相关文章

  1. 【转载】Sqlserver使用Group By进行分组并计算每个组的数量

    在SQL语句查询中,Group By语句时常用来进行分组操作,有时候在分组的同时还需要计算出每个组的数量多少.在Sqlserver数据库中可以使用Group By加Count聚合函数来实现此功能,即通 ...

  2. 关于GROUP BY和聚合函数

    可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...

  3. sqlserver判断是否为数字的函数

    ISNUMERIC 确定表达式是否为一个有效的数字类型. 语法  ISNUMERIC ( expression ) 参数 expression 要计算的表达式. 返回类型 int 测试: select ...

  4. 可以这样去理解group by和聚合函数

    写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是 ...

  5. group by 和聚合函数

    group by 的基本用法 group by做为分组来使用,后面为条件,可以有多个条件,条件相同的为一组,配合聚合函数进行相关统计.在不同数据库中用法稍有不同,这里只测试mysql和oracle. ...

  6. 可以这样去理解group by和聚合函数(转)

    http://www.cnblogs.com/wuguanglei/p/4229938.html 写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不 ...

  7. sql 学习之 group by 及 聚合函数

    1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列.同样,如果在SELECT 列表中使用聚合列,SEL ...

  8. 【SQL】SqlServer中Group By后,字符串合并

    参考: 1.SQL查询语句 group by后, 字符串合并 2.sql for xml path用法 #需求: 合并列值 表结构,数据如下: id value ----- ------ aa bb ...

  9. 字符串函数 mysql 和sqlserver 中对于字符串的常用函数和区别

    1. 对于字符串大小写的统一 mysql和sqlserver中都有同名函数lower()和upper(),但是mysql中还有另外一对函数,达到同样的目的,lcase()和ucase(),也就是英文中 ...

随机推荐

  1. 深入浅出SharePoint2013——使用沙箱解决方案

    启用“Microsoft SharePoint Foundation Sandboxed Code Service”后,我们就可以使用Sandboxed solution了.

  2. December 22nd 2016 Week 52nd Thursday

    The best hearts are always the bravest. 心灵最高尚的人,往往也是最勇敢的人. Keep conscience clear, don't let too many ...

  3. php中的mysql_fetch_row,mysql_fetch_array,mysql_fetch_object

    1.mysql_fetch_row mysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回.每个结果的列储存在一个数组的单元 ...

  4. 美团2018年CodeM大赛-初赛B轮 B 配送(最短路)

    美团2018年CodeM大赛-初赛B轮 B 配送 题意 题解 对于每个任务,只要从上个任务的终点出发即可. 时间.地点很少,可以算出每个地点-时间的最小花费. 以题目描述的起点终点起始结束时间建图,很 ...

  5. UVa 11346 - Probability(几何概型)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. P2564 [SCOI2009]生日礼物

    题目背景 四川2009NOI省选 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可 ...

  7. vue2.* 目录结构分析 数据绑定 循环渲染数据 数据渲染02

    一.目录 结构分析 node_modules:项目依赖文件(也可以说是模块) src:开发时所用的资源 assets:静态资源文件 App.vue:根组件(最基础的公共页面) main.js:实例化v ...

  8. Odoo中Application与modules的区别

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278681.html 一:Application(应用) application一般是针对大功能的模块,如提供 ...

  9. 五子棋项目总结 JavaScript+jQuery(插件写法)+bootstrap(模态框)

    Html部分(界面): 1.五子棋棋盘由canvas完成: 2.两个按钮,样式由bootstrap完成: 3.菜单按钮对应的模态框,可以选择游戏模式:玩家自由对战,和电脑对战,还可以指定谁先执子和哪个 ...

  10. 【Vue】安装(NPM 方法)

    [Vue2.0 新手完全填坑攻略——从环境搭建到发布]http://www.jianshu.com/p/5ba253651c3b 1.在用 Vue.js 构建大型应用时推荐使用 NPM 安装 2.Vu ...