MySql8.x---开窗函数

1、定义 

语法结构: ** 开窗函数|聚合函数 over([分组函数] [排序函数] [自定义窗口]) **

分组函数:partition by ...,根据指定的字段对表分组,分组字段可以有多个。省略时表示整个表为一组。

排序函数:order by ...,排序字段也可以有多个,当排序字段为多个时表示先按照第一个字段排序,当第一个字段相等确定不了顺序时再按照第二个字段排序,以此类推…

自定义窗口:mysql中的窗口类型有两种:rows和range。rows是以物理行距离为基准通过计算与当前行的物理距离计算窗口大小,range是以当前行的值为基准通过计算与当前行值的差值计算窗口大小。

窗口大小可通过between 上界 and 下界来指定,其中,窗口的上下界分别有下面几种取值:

  • unbounded preceding:包含当前行及当前行之前的所有记录。
  • n preceding:包含当前行及当前行之前的n-1行,实际窗口大小n。
  • current row:仅包含当前行。
  • unbounded following:包含当前行及当前行之后的所有记录。
  • n following:包含当前行及当前行之后的n-1行,实际窗口大小n。

当窗口下界为current row时,可以不使用between and,也就是下面几种情况可简写:

  1. between unbounded preceding and current row --> unbounded preceding
  2. between n preceding and current row --> n preceding
  3. between current row and current row --> current row

排序

  • row_number() over() 从小到大依次排序 如:1,2,3,4,5
  • rank() over() 相同数据并列保存,下一个值跳值,如:1,2,2,4
  • dense_rank() over() 相同数据并列保存,不存着断值,如:1,2,2,3,3,3,4

位移

  • lag(字段,往下位移行数,往下没有行时默认值) over()
  • lead(字段,往上位移行数,往上没有行时默认值) over()

求和

  • sum(字段) over()

指定顺序的字段值:

  • first_value(col):取窗口中字段col的第一个值。
  • last_value(col):取窗口中字段col的最后一个值。
  • nth_value(col, n):取窗口中第n顺序的值。

2、语法

  • 方式一:按照列所有行进行分组

over(partition by 列)

  • 方式二:按照列排序

over(order by 列)

  • 方式三:按照列1分组,按照列2排序

over(partition by 列1 order by 列2)

3、练习

源数据sql:

CREATE TABLE `student_scores` (
  `sid` INT PRIMARY KEY,
  `student_id` INT,
  `student_name` VARCHAR(50),
  `course_id` INT,
  `course_name` VARCHAR(50),
  `num` INT
);

INSERT INTO `student_scores` (`sid`, `student_id`, `student_name`, `course_id`, `course_name`, `num`) VALUES
(1, 1, 'Alice', 1, 'Math', 10),
(2, 1, 'Alice', 2, 'Physics', 9),
(5, 1, 'Alice', 4, 'Biology', 66),
(6, 2, 'Bob', 1, 'Math', 8),
(8, 2, 'Bob', 3, 'Chemistry', 68),
(9, 2, 'Bob', 4, 'Biology', 99),
(10, 3, 'Charlie', 1, 'Math', 77),
(11, 3, 'Charlie', 2, 'Physics', 66),
(12, 3, 'Charlie', 3, 'Chemistry', 87),
(13, 3, 'Charlie', 4, 'Biology', 99),
(14, 4, 'David', 1, 'Math', 79),
(15, 4, 'David', 2, 'Physics', 11),
(16, 4, 'David', 3, 'Chemistry', 67),
(17, 4, 'David', 4, 'Biology', 100),
(18, 5, 'Eve', 1, 'Math', 79),
(19, 5, 'Eve', 2, 'Physics', 11),
(20, 5, 'Eve', 3, 'Chemistry', 67),
(21, 5, 'Eve', 4, 'Biology', 100),
(22, 6, 'Frank', 1, 'Math', 9),
(23, 6, 'Frank', 2, 'Physics', 100),
(24, 6, 'Frank', 3, 'Chemistry', 67),
(25, 6, 'Frank', 4, 'Biology', 100);

# 每门学科的第一名,有并列的情况一起就一起展示
SELECT
	* 
FROM
	( SELECT *, DENSE_RANK() over ( PARTITION BY course_id ORDER BY source DESC ) AS num FROM student_scores ) xx 
WHERE
	xx.num <=1;
	
#每个人不同学科中的最高分
SELECT
	* 
FROM
	( SELECT *, DENSE_RANK() over ( PARTITION BY student_id ORDER BY source DESC ) AS num FROM student_scores ) xx 
WHERE
	xx.num <=1;


#每门学科的平均分
SELECT
	course_name,
	courseAvg	
FROM
	( SELECT *,avg(source) as courseAvg, ROW_NUMBER() over ( PARTITION BY course_id ORDER BY source DESC ) AS num FROM student_scores GROUP BY course_id ) xx ;
	
#每人课程得分高于课程平均分的数量
SELECT
	student_name,
	SUM(CASE 
            WHEN source > courseAvg THEN 1
            ELSE 0
        END) as 及格数
FROM
	( SELECT *,avg(source) over(PARTITION by course_id  ) as courseAvg FROM student_scores GROUP BY course_id,student_id ) xx 
	GROUP BY xx.student_id

[root@yfw ~]# cd /www/wwwroot/szrengjing.com/jsxc [root@yfw jsxc]# ls -la total 2356 drwxr-xr-x 17 root root 4096 Nov 11 14:37 . drwxr-xr-x 29 www www 4096 Nov 11 11:05 .. -rwxr-xr-x 1 www www 23436 Aug 9 2024 CHANGELOG.md -rwxr-xr-x 1 www www 3222 Aug 9 2024 CODE_OF_CONDUCT.md -rwxr-xr-x 1 www www 515 Aug 9 2024 .commitlintrc.json -rwxr-xr-x 1 www www 251 Aug 9 2024 CONTRIBUTING.md -rwxr-xr-x 1 www www 720 Aug 9 2024 custom.d.ts -rwxr-xr-x 1 www www 298 Nov 11 09:01 deploy.sh drwxr-xr-x 9 www www 4096 Nov 10 15:01 dist -rwxr-xr-x 1 www www 261 Aug 9 2024 .editorconfig -rwxr-xr-x 1 www www 6846 Aug 9 2024 .eslintrc.js drwxr-xr-x 6 www www 4096 Aug 9 2024 example -rwxr-xr-x 1 www www 217 Aug 9 2024 .fantasticonrc.js drwxr-xr-x 2 www www 4096 Aug 9 2024 fonts drwxr-xr-x 8 www www 4096 Nov 10 15:00 .git drwxr-xr-x 4 www www 4096 Aug 9 2024 .github -rwxr-xr-x 1 www www 141 Aug 9 2024 .gitignore drwxr-xr-x 6 www www 4096 Aug 9 2024 images -rwxr-xr-x 1 root root 1184795 Nov 10 11:11 jsxc-master.zip -rwxr-xr-x 1 www www 2859 Aug 9 2024 karma.conf.js -rwxr-xr-x 1 www www 180 Aug 9 2024 .lgtm.yml -rwxr-xr-x 1 www www 1110 Aug 9 2024 LICENSE drwxr-xr-x 2 www www 4096 Aug 9 2024 locales drwxr-xr-x 1062 www www 36864 Nov 10 17:38 node_modules -rwxr-xr-x 1 www www 302 Aug 9 2024 .npmignore -rwxr-xr-x 1 www www 5138 Nov 10 17:38 package.json -rw-r--r-- 1 www www 593471 Nov 10 17:38 package-lock.json -rwxr-xr-x 1 www www 79 Aug 9 2024 .prettierrc.json -rwxr-xr-x 1 www www 2116 Aug 9 2024 README.md drwxr-xr-x 2 www www 4096 Aug 9 2024 scripts drwxr-xr-x 5 www www 4096 Aug 9 2024 scss drwxr-xr-x 2 www www 4096 Aug 9 2024 sound drwxr-xr-x 11 www www 4096 Aug 9 2024 src -rwxr-xr-x 1 www www 498 Aug 9 2024 .stylelintrc drwxr-xr-x 4 www www 4096 Aug 9 2024 template drwxr-xr-x 4 www www 4096 Aug 9 2024 test -rwxr-xr-x 1 www www 918 Aug 9 2024 tsconfig.json drwxr-xr-x 2 www www 4096 Aug 9 2024 .vscode -rwxr-xr-x 1 www www 8753 Nov 10 14:59 webpack.config.js -rwxr-xr-x 1 www www 408244 Aug 9 2024 yarn.lock [root@yfw jsxc]# [root@yfw ~]# cd /www/wwwroot/szrengjing.com/js [root@yfw js]# ls -la total 644 drwxr-xr-x 7 www www 4096 Oct 9 2023 . drwxr-xr-x 29 www www 4096 Nov 11 11:05 .. -rwxr-xr-x 1 www www 5730 Sep 20 2017 auto_complete.js drwxr-xr-x 2 www www 4096 Oct 9 2023 calendar -rwxr-xr-x 1 www www 1228 Sep 20 2017 calendar.php -rwxr-xr-x 1 www www 8152 Sep 20 2017 category_selecter.js drwxr-xr-x 3 www www 4096 Nov 11 10:02 chat -rwxr-xr-x 1 www www 39101 Mar 29 2025 common.js -rwxr-xr-x 1 www www 18478 Sep 20 2017 common.min.js -rwxr-xr-x 1 www www 5782 Sep 20 2017 compare.js drwxr-xr-x 2 www www 4096 Oct 9 2023 countdown -rwxr-xr-x 1 www www 3388 Sep 20 2017 global.js -rwxr-xr-x 1 www www 985 Sep 20 2017 helpmenu.js -rwxr-xr-x 1 www www 2463 Sep 20 2017 index.js -rwxr-xr-x 1 www www 65877 Sep 20 2017 jquery-1.6.2.min.js -rwxr-xr-x 1 www www 28773 Sep 20 2017 jquery.countdown-2.5.3.js -rwxr-xr-x 1 www www 7018 Sep 20 2017 jquery.countdown-2.5.3.min.js -rwxr-xr-x 1 www www 8165 Sep 20 2017 jquery.easing.1.3.js -rwxr-xr-x 1 www www 50666 Sep 20 2017 jquery.js -rwxr-xr-x 1 www www 4823 Sep 20 2017 jquery.json.js -rwxr-xr-x 1 www www 57290 Sep 20 2017 jquery.min.js -rwxr-xr-x 1 www www 60591 Sep 20 2017 jquery.ztree.all-3.5.min.js -rwxr-xr-x 1 www www 17521 Sep 20 2017 json2.js -rwxr-xr-x 1 www www 1339 Sep 20 2017 left_goodslist.js -rwxr-xr-x 1 www www 3344 Sep 20 2017 lefttime.js drwxr-xr-x 4 www www 4096 Oct 9 2023 My97DatePicker -rwxr-xr-x 1 www www 851 Sep 20 2017 myship.js -rwxr-xr-x 1 www www 1147 Sep 20 2017 order_pickpoint.js -rwxr-xr-x 1 www www 2489 Sep 20 2017 region.js -rwxr-xr-x 1 www www 18244 Sep 20 2017 register.js -rwxr-xr-x 1 www www 27357 Dec 30 2024 shopping_flow.js -rwxr-xr-x 1 www www 2479 Sep 20 2017 showdiv.js -rwxr-xr-x 1 www www 3013 Sep 20 2017 sms.js -rwxr-xr-x 1 www www 22730 Sep 20 2017 transport.js -rwxr-xr-x 1 www www 22671 Sep 20 2017 transport.org.js -rwxr-xr-x 1 www www 29005 Sep 20 2017 userbf.js -rwxr-xr-x 1 www www 39580 Sep 20 2017 user.js -rwxr-xr-x 1 www www 4487 Sep 20 2017 utils.js drwxr-xr-x 2 www www 4096 Oct 9 2023 validate [root@yfw js]# [root@yfw ~]# cd /www/wwwroot/szrengjing.com/js/chat [root@yfw chat]# ls -la total 352 drwxr-xr-x 3 www www 4096 Nov 11 10:02 . drwxr-xr-x 7 www www 4096 Oct 9 2023 .. ---------- 1 www www 6295 Nov 7 17:25 auto-connect.js -rwxr-xr-x 1 www www 1956 Sep 20 2017 b64.js -rwxr-xr-x 1 www www 8146 Nov 9 19:50 chat.js -rwxr-xr-x 1 www www 2745 Nov 11 10:03 customer-service.html -rwxr-xr-x 1 www www 8615 Sep 20 2017 md5.js -rwxr-xr-x 1 www www 5632 Sep 20 2017 sha1.js -rwxr-xr-x 1 www www 53803 Nov 6 01:15 strophe.js drwxrwxr-x 8 root root 4096 Nov 6 01:12 strophejs-3.0.1 -rwxr-xr-x 1 www www 165543 Nov 6 00:53 strophejs-3.0.1.tar.gz -rw-r--r-- 1 www www 53803 Nov 7 10:26 strophe.min.js -rwxr-xr-x 1 www www 1879 Nov 10 18:14 test-connection.html -rwxr-xr-x 1 www www 4491 Nov 10 18:20 test.html -rwxr-xr-x 1 www www 7533 Nov 11 11:26 webchat.js [root@yfw chat]# 能不能统一配置 实向在线客服 lm
最新发布
11-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lin_XXiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值