OVER (PARTITION BY…)的用法

OVER (PARTITION BY…) 按照某列分割/区分

SELECT EMP.*,SUM(SAL) OVER(PARTITION BY DEPTNO) 本部门工资总和 FROM EMP

   deptno  ename     sal    本部门工资总和

1       10     CLARK     2450.00      8750

2       10     KING        5000.00      8750

3       10     MILLER    1300.00      8750

4       20     SMITH      800.00        10875

5       20     ADAMS    1100.00      10875

6       20     FORD        3000.00      10875

7       20     SCOTT      3000.00      10875

8       20     JONES       2975.00      10875

9       30     ALLEN      1600.00      9400

10     30     BLAKE     2850.00      9400

11     30     MARTIN  1250.00      9400

12     30     JAMES      950.00        9400

13     30     TURNER  1500.00      9400

14     30     WARD       1250.00      9400

DEPTNO列列值相同的对应的sal加和

 

如果不需要已某个列的值分割,那就要用null,因为没有分割列,所以“工资总和”的值为所有sal列的值的和

SELECT EMP.*,SUM(SAL) OVER(PARTITION BY DEPTNO) 工资总和 FROM EMP

1       10     CLARK     2450.00      29025

2       10     KING        5000.00      29025

3       10     MILLER    1300.00      29025

4       20     SMITH      800.00        29025

5       20     ADAMS    1100.00      29025

6       20     FORD        3000.00      29025

7       20     SCOTT      3000.00      29025

8       20     JONES       2975.00      29025

9       30     ALLEN      1600.00      29025

10     30     BLAKE     2850.00      29025

11     30     MARTIN  1250.00      29025

12     30     JAMES      950.00        29025

13     30     TURNER  1500.00      29025

14     30     WARD       1250.00      29025

 

使用 sum(sal) over (order by ename)... 查询员工的薪水"连续"求和

SELECT EMP.*,SUM(SAL) OVER(ORDER BY ENAME) 按姓名排序后连续求和,100*ROUND(SAL/SUM(SAL) OVER (),4) "份额(%)" FROM EMP

1       20     ADAMS    1100.00      1100 3.79

2       30     ALLEN      1600.00      2700 5.51

3       30     BLAKE     2850.00      5550 9.82

4       10     CLARK     2450.00      8000 8.44

5       20     FORD        3000.00      11000         10.34

6       30     JAMES      950.00        11950         3.27

7       20     JONES       2975.00      14925         10.25

8       10     KING        5000.00      19925         17.23

9       30     MARTIN  1250.00      21175         4.31

10     10     MILLER    1300.00      22475         4.48

11     20     SCOTT      3000.00      25475         10.34

12     20     SMITH      800.00        26275         2.76

13     30     TURNER  1500.00      27775         5.17

14     30     WARD       1250.00      29025         4.31

 

SELECT EMP.*,SUM(SAL) OVER (PARTITION BY DEPTNO ORDER BY ENAME) 按照部门连续求总和 FROM EMP

1       10     CLARK     2450.00    2450

2       10     KING         5000.00    7450

3       10     MILLER    1300.00    8750

4       20     ADAMS     1100.00    1100

5       20     FORD       3000.00    4100

6       20     JONES     2975.00    7075

7       20     SCOTT     3000.00    10075

8       20     SMITH       800.00      10875

9       30     ALLEN      1600.00    1600

10     30     BLAKE      2850.00    4450

11     30     JAMES      950.00      5400

12     30     MARTIN    1250.00    6650

13     30     TURNER  1500.00    8150

14     30     WARD       1250.00    9400


SELECT EMP.*,SUM(SAL) OVER (ORDER BY DEPTNO,ENAME)
所有部门连续求总和 FROM EMP

1       10     CLARK     2450.00    2450

2       10     KING         5000.00    7450

3       10     MILLER    1300.00    8750

4       20     ADAMS     1100.00    9850

5       20     FORD       3000.00    12850

6       20     JONES     2975.00    15825

7       20     SCOTT     3000.00    18825

8       20     SMITH       800.00      19625

9       30     ALLEN      1600.00    21225

10     30     BLAKE      2850.00    24075

11     30     JAMES      950.00      25025

12     30     MARTIN    1250.00    26275

13     30     TURNER  1500.00    27775

14     30     WARD       1250.00    29025
sum(sal) over ()
不按部门,求所有员工总和,效果等同于sum(sal)

 

部门从大到小排列,部门里各员工的薪水从高到低排列

SELECT DEPTNO,ENAME,SAL,SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY DEPTNO DESC, SAL DESC) DEPT_SUM,

SUM(SAL) OVER(ORDER BY DEPTNO DESC, SAL DESC) SUM FROM EMP;

1       30     BLAKE     2850.00      2850 2850

2       30     ALLEN      1600.00      4450 4450

3       30     TURNER  1500.00      5950 5950

4       30     MARTIN   1250.00      8450 8450

5       30     WARD       1250.00      8450 8450

6       30     JAMES      950.00        9400 9400

7       20     FORD       3000.00      6000 15400

8       20     SCOTT    3000.00      6000 15400

9       20     JONES       2975.00      8975 18375

10     20     ADAMS    1100.00      10075         19475

11     20     SMITH      800.00        10875         20275

12     10     KING        5000.00      5000 25275

13     10     CLARK     2450.00      7450 27725

14     10     MILLER    1300.00      8750 29025

### 回答1: MySQL 中的 OVER PARTITION BY 子句用于在对每个分区中的行进行聚合操作时对结果进行排序。其语法为: SELECT column_name, aggregate_function(column_name) OVER (PARTITION BY column_name_for_partition ORDER BY column_name_for_ordering) FROM table_name; 其中,aggregate_function 可以是 COUNT、SUM、AVG 等聚合函数,column_name_for_partition 是用于分区的列名,column_name_for_ordering 是用于排序的列名。 例如: SELECT id, name, salary, SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) as department_total_salary FROM employees; 该语句会对员工表中的每个部门的员工的工资求和,并按工资降序排序。 ### 回答2: MySQL中的over partition by语法是一种强大的分析函数,它可以让用户分析和计算分组数据的各种指标,例如排名、分组求和、分组平均等。在这里我们将主要讨论MySQL中over partition by语法用法和实际应用。 首先,over partition by语法主要用于对分组数据进行分析和计算。一个最典型的应用场景是,我们需要根据某个列进行分组(例如按部门分组),然后对每个分组内的数据进行rank、sum、average、row_number等各种计算。这个时候,over partition by语法就可以大显神威了。例如,下面的语句用于计算每个部门的平均工资: ``` SELECT department, AVG(salary) OVER (PARTITION BY department) AS avg_salary FROM employee; ``` 在这个例子中,我们使用了over partition by语法,指定对每个部门进行分组,然后对分组内的salary求平均值,最后将结果作为一个新的列avg_salary返回。 除了平均值之外,我们还可以使用同样的方式计算每个部门内每个员工的排名或行号,例如: ``` SELECT department, name, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employee; ``` 在这个例子中,我们使用了ROW_NUMBER()函数,对每个部门进行分组,然后按照工资从高到低排序,最后为每个分组内的每个员工计算一个排名。 除了ROW_NUMBER()之外,MySQL中还提供了很多其他有用的分析函数,例如SUM()、AVG()、MAX()、MIN()等,都可以配合partition by语法使用。需要注意的是,over子句必须放在所有其他子句(例如where、group by、order by等)的后面。 总体来说,over partition by语法是MySQL中一个非常有用的分析函数,它可以大大简化我们对数据分组的处理逻辑,并且提供了很多有用的函数和功能,让我们的数据分析工作更加便捷和高效。 ### 回答3: MySQL over partition by是一项高级窗口功能,它允许我们在MySQL查询中对结果集进行分区,并可以应用聚合函数和类似的分析函数来计算每个分区的值。 over partition by是针对窗口函数的一种用法。窗口函数是一种SQL语句中用于执行计算的高级函数,允许我们在结果集上执行聚合操作,并返回有关每个行分组的统计数据。 over partition by允许指定一个或多个列用于对结果集进行分区,这使得我们可以按照指定的列将结果集划分为多个子集。然后,我们可以在每个子集中计算聚合函数或其他分析函数,例如计算累积总和、计算当前行以前的行数等。 在使用over partition by之前,需要先定义一个窗口。窗口定义了查询中将使用分析和/或聚合函数的范围。窗口有两个主要部分:窗口规范和窗口框架。 窗口规范定义了要应用窗口函数的分区,可以使用partition by子句来指定。窗口框架定义了在分区内应用窗口函数的一系列行,可以使用rows或range子句来定义范围。如果没有定义窗口框架,则将对整个分区应用聚合函数。 下面是一个使用over partition by查询的例子,我们将对sales表进行分区,并计算每个分区中的行数、销售总额和平均销售额: SELECT date, region, product, sales, COUNT(*) OVER(PARTITION BY region, product) AS sales_count, SUM(sales) OVER(PARTITION BY region, product) AS sales_total, AVG(sales) OVER(PARTITION BY region, product) AS sales_avg FROM sales; 这个查询将返回按区域和产品分组的销售统计数据,包括每组的行数、销售总额和平均销售额。使用over partition by语法,我们可以更轻松地进行数据处理和分析,而无需编写复杂的嵌套子查询或联接语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值