SQL进阶教程——GROUP BY 和PARTITION BY(2-5)

1. 类

group by和partition by的区别在于,group by会在分类之后进行聚合操作

  1. 划分出的子集都是非空集合
  2. 所以子集的并集等于划分之前的集合
  3. 任何两个子集之间都没有交集

满足以上三个性质的各子集称为“类”

通过对3取余给自然数集合N分类后,我们会得到下面三个类

  • 余0的类:M1={0,3,6,9…}
  • 余1的类:M2={1,4,7…}
  • 余2的类:M3={2,5,8…}

这三个类涵盖了全部自然数
M1+M2+M3=N

### 关于SQL中 `GROUP BY` `PARTITION BY` 的高级教程 #### 使用场景对比 `GROUP BY` 子句用于汇总数据并返回每个分组的结果集。这意味着对于每一个唯一的组合,只会有一条记录被返回。而窗口函数中的 `PARTITION BY` 则允许在同一查询结果集中保留所有的原始行数,并基于指定列对这些行进行分区,在不减少总行数的情况下执行聚合操作。 例如,当统计员工工资时: - 如果使用 `GROUP BY`, 将得到每部门平均薪资的一览表; - 若采用带有 `PARTITION BY` 的窗口函数,则可以在保持原表格结构的同时增加一列表示每位成员所在部门内的相对位置或排名等附加信息[^1]。 #### 实际应用案例 考虑有一个名为 `sales` 的销售记录表,其中包含销售人员的名字 (`name`)、所属区域(`region`)以及销售额(`amount`)三个字段。现在想要了解各地区内不同人员的具体表现情况。 ##### 方法一:利用 `GROUP BY` ```sql SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region; ``` 这段代码会给出各个地区的总体业绩概况,但丢失了个人层面的信息。 ##### 方法二:借助 `PARTITION BY` 为了既能看到整体也能关注个体贡献度,可以这样写: ```sql SELECT name, region, amount, AVG(amount) OVER (PARTITION BY region) as avg_regional_sale FROM sales; ``` 此语句不仅提供了每个人的销售金额,还额外计算出了他们各自所处区域内所有人的平均成绩作为参照标准[^2].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值