over partition by与group by 区别

over partition by与group by是都是分组统计的函数。

区别

1. over partition by 其中partition by 只是over一个子句参数,作用就是分组。over 子句可以与聚合函数结合使用(max、min、sum、avg、count等).下面我们看一个例子

 

     

-- 创建表并插入数据
CREATE TABLE Employee
(
  ID int identity(1,1),
  EmpName varchar(20),
  EmpSalary varchar(10),
  EmpDepartment varchar(20) 
);

INSERT INTO Employee
SELECT '张三','5000','开发部' UNION ALL
SELECT '李四','2000','销售部'  UNION ALL
SELECT '王麻子','2500','销售部' UNION ALL
SELECT '张三表叔','8000','开发部' UNION ALL
SELECT '李四表叔','5000','开发部' UNION ALL
SELECT '王麻子表叔','5000','销售部'

-- 现在使用来对 部门进行分组,使用over partition by分组,按照工资排序(使用ROW_NUMBER()函数来生成一列)
SELECT * ,ROW_NUMBER() OVER(PARTITION BY EmpDepartment ORDER BY EmpSalary) EmpNumber FROM Employee

-- 执行结果如下:

ID          EmpName              EmpSalary  EmpDepartment        EmpNumber
--------- -------------------- ---------- -------------------- --------------------
1           张三                   5000       开发部                  1
5           李四表叔                 5000       开发部                  2
4           张三表叔                 8000       开发部                  3
6           王麻子表叔                5000       销售部                   1
2           李四                   2000       销售部                  1
3           王麻子                  2500       销售部                  2

 

 2. 假如现在 使用  over partition by 分组,并取得最高工资的员工信息,我们看看会有什么问题

SELECT * ,MAX(EmpSalary) OVER(PARTITION BY EmpDepartment) MaxSalary FROM Employee

-- 执行结果 ID          EmpName              EmpSalary  EmpDepartment        MaxSalary ----------- -------------------- ---------- -------------------- ---------- 1           张三                   5000       开发部                  8000 4           张三表叔                 8000       开发部                  8000 5           李四表叔                 5000       开发部                  8000 6           王麻子表叔                5000       销售部                  5000 2           李四                   2000       销售部                  5000 3           王麻子                  2500       销售部                  5000

(6 行受影响)


查看执行结果不难发现,最大工资是获取到了,可是不需要的列也显示出来了。

使用Group by来分组就没有(相信可能使用over partition by 也可以实现如group by 这样的分组)

SELECT EmpDepartment,MAX(EmpSalary) FROM Employee 
GROUP BY EmpDepartment

-- 执行结果
EmpDepartment        
-------------------- ----------
开发部                  8000
销售部                  5000

(2 行受影响)


group by是对检索结果的保留行进行单纯分组,一般和聚合函数一起使用例如max、min、sum、avg、count等一块用。 (官方参考文档:http://technet.microsoft.com/zh-cn/library/ms177673.aspx)

partition by虽然也具有分组功能,但同时也具有其他的高级功能。(可以参考官方文档:http://technet.microsoft.com/zh-cn/library/ms189461.aspx)

 

注:如上如有错误地方,欢迎大家指出,互相学习。

 

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
partition by和group by是在SQL中用于分组和聚合数据的关键字,它们之间有以下区别: 1. 功能不同: - group by是用于将数据按照指定的列进行分组,然后对每个组进行聚合操作,例如求和、计数等。 - partition by是用于在分析函数中指定分组的方式,它定义了每个分组的范围,然后在每个分组内进行计算。 2. 执行顺序不同: - 在SQL语句的执行顺序中,group by是在where之后、select之前执行的,它先根据指定的列进行分组,然后对每个组进行聚合操作。 - partition by是在select之后执行的,它根据指定的列进行分组,并在每个分组内进行计算。 3. 使用场景不同: - group by适用于需要对整个数据集进行分组和聚合的情况,例如统计每个部门的销售总额。 - partition by适用于需要在每个分组内进行计算的情况,例如计算每个部门的销售额占比。 下面是一个示例,演示了partition by和group by的区别: 假设有一个表sales,包含以下字段:department(部门)、product(产品)、quantity(数量)、price(单价)。 1. 使用group by计算每个部门的销售总额: ```sql SELECT department, SUM(quantity * price) AS total_sales FROM sales GROUP BY department; ``` 2. 使用partition by计算每个部门的销售额占比: ```sql SELECT department, product, quantity * price / SUM(quantity * price) OVER (PARTITION BY department) AS sales_ratio FROM sales; ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值