SQL开窗函数
文章目录
- 概念:
- 语法:
- 常用的窗口函数及示例:
- 求平均值:AVG() :
- 求和:SUM():
- 求排名:
- 移动平均
- 计数COUNT():
- 求最大MXA()/小MIN()值
- 求分区内的最大/最小值
- 求当前行的前/后一个值
概念:
开窗函数是对于每条记录 都要在此窗口内执行函数,它对数据的每一行 ,都使用与该行相关的行进行计算并返回计算结果。开窗函数的本质还是聚合运算,只不过它更具灵活性。
开窗函数和普通聚合函数的区别:
- 聚合函数是将多条记录聚合为一条;而开窗函数是每条记录都会执行,有几条记录执行完还是几条。
- 聚合函数也可以用于开窗函数中。
应用:
窗口函数提供了在查询结果中进行排序、排名、聚合和分析的灵活性。窗口函数在数据分析和报表生成中非常有用,可以实现更复杂的计算和分析需求。
语法:
window_function() OVER (
[PARTITION BY partition_expression]
[ORDER BY order_list]
[frame_clause] )
开窗函数的一个概念是当前行,当前行属于某个窗口,窗口由over关键字用来指定函数执行的窗口范围,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所行,开窗函数基于所有行进行计算;如果不为空,则有三个参数来设置窗口:
- window_function(): 要使用的窗口函数,如:ROW_NUMBER(), RANK(), DENSE_RANK(), LEAD(), LAG(), SUM(), AVG() 等。
- PARTITION BY: 可选项,用于将结果集划分为分区,以便窗口函数在每个分区内计算。
- ORDER BY: 可选项,用于指定结果集的排序顺序,窗口函数将根据指定的排序顺序进行计算。
- frame_clause: 可选项,用于指定窗口中要考虑的行的范围。常见的 frame 类型包括 ROWS, RANGE 等,通常用来作为滑动窗口使用。
对于滑动窗口的范围指定,通常使用 between frame_start and frame_end 语法来表示行范围,frame_start和frame_end可以支持如下关键字,来确定不同的动态行记录:
current row 边界是当前行,一般和其他范围关键字一起使用
unbounded preceding 边界是分区中的第一行
unbounded following 边界是分区中的最后一行
expr preceding 边界是当前行减去expr的值
expr following 边界是当前行加上expr的值
示例:
rows between 1 preceding and 1 following 窗口范围是当前行、前一行、后一行一共三行记录。
rows unbounded preceding 窗口范围是当前行到分区中的最后一行。
rows between unbounded preceding and unbounded following 窗口范围是当前分区中所有行,等同于不写。
常用的窗口函数及示例:
以下是一些MySQL中常用的窗口函数:
示例数据: 销售表包含以下列:销售部门、销售产品、销售日期、销售员、销售数量、产品单价;(销售额=销售数量*产品单价)
CREATE TABLE sales (department VARCHAR(50),product VARCHAR(50),sale_date DATE,salesperson VARCHAR(50),quantity INT,unit_price DECIMAL(10,2)
);INSERT INTO sales (department, product, sale_date, salesperson, quantity, unit_price)
VALUES
('销售1部','1001','2024/5/3','王明','15','200'),
('销售2部','1002','2024/5/10','徐小小','20','500'),
('销售3部','1002','2024/5/18','纪风','10','500'),
('销售1部','1001','2024/5/5','王明','30','200'),
('销售2部','1002','2024/5/12','徐小小','25','500'),
('销售3部','1001','2024/5/20','纪风','18','200'),
('销售1部','1001','2024/5/8','王明','12','200'),
('销售2部','1002','2024/5/25','徐小小','22','500'),
('销售2部','1003','2024/5/15','徐小小','8','1000'),
('销售1部','1001','2024/5/30','王明','16','200'),
('销售2部','1002','2024/5/1','徐小小','14','500'),
('销售3部','1003','2024/5/22','纪风','19','1000'),
('销售2部','1001','2024/5/7','徐小小','21','200'),
('销售2部','1002','2024/5/28','刘阳','11','500'),
('销售3部','1003','2024/5/17','纪风','24','1000'),
('销售1部','1001','2024/5/4','王明','17','200'),
('销售2部','1002','2024/5/13','刘阳','9','500'),
('销售3部','1003','2024/5/21','纪风','23','1000'),
('销售1部','1001','2024/5/29','张一','7','200'),
('销售2部','1002','2024/5/6','刘阳','13','500'),
('销售3部','1003','2024/5/23','付华','18','1000'),
('销售1部','1001','2024/5/2','张一','20','200'),
('销售2部','1002','2024/5/9','刘阳','10','500'),
('销售3部','1003','2024/5/26','付华','30','1000'),
('销售1部','1001','2024/5/14','张一','25','200'),
('销售2部','1002','2024/5/31','刘阳','18','500'),
('销售3部','1003','2024/5/24','付华','12','1000'),
('销售1部','1001','2024/5/11','张一','22','200'),
('销售2部','1002','2024/5/19','刘阳','8','500'),
('销售3部','1003','2024/5/27','付华','16','1000'),
('销售1部','1001','2024/5/16','张一','14','200'),
('销售2部','1002','2024/5/3','刘阳','19','500'),
('销售3部','1003','2024/5/20','付华','21','1000'),
('销售1部','1001','2024/5/7','张一','11','200'),
('销售2部','1002','2024/5/24','刘阳','24','500'),
('销售3部','1003','2024/5/12','付华','17','1000'),
('销售1部','1001','2024/5/29','张一','9','200'),
('销售1部','1002','2024/5/5','张一','23','500'),
('销售2部','1003','2024/5/22','刘阳','7','1000'),
('销售3部','1001','2024/5/9','付华','13','200'),
('销售1部','1002','2024/5/16','张一','18','500'),
('销售2部','1003','2024/5/23','刘阳','20','1000'),
('销售3部','1001','2024/5/1','付华','10','200'),
('销售1部','1002','2024/5/18','张一','30','500'),
('销售2部','1003','2024/5/25','刘阳','25','1000'),
('销售3部','1001','2024/5/2','付华','18','200'),
('销售1部','1002','2024/5/11','张一','10','500'),
('销售2部','1003','2024/5/9','刘阳','50','1000'),
('销售3部','1001','2024/5/10','付华','5','200');
求平均值:AVG() :
查询各部门的平均销售额(需保留全部行信息)
SELECT *,quantity*unit_price as sale,avg(quantity*unit_price) over(partition by department ) avg_sale from sales;
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
| department | product | sale_date | salesperson | quantity | unit_price | sale | avg_sale |
| 销售1部 | 1001 | 2024/5/3 | 王明 | 15 | 200 | 3000 | 5006.25 |
| 销售1部 | 1001 | 2024/5/7 | 张一 | 11 | 200 | 2200 | 5006.25 |
| 销售1部 | 1001 | 2024/5/29 | 张一 | 9 | 200 | 1800 | 5006.25 |
| 销售1部 | 1001 | 2024/5/5 | 王明 | 30 | 200 | 6000 | 5006.25 |
| 销售1部 | 1001 | 2024/5/29 | 张一 | 7 | 200 | 1400 | 5006.25 |
| 销售1部 | 1002 | 2024/5/5 | 张一 | 23 | 500 | 11500 | 5006.25 |
| 销售1部 | 1001 | 2024/5/8 | 王明 | 12 | 200 | 2400 | 5006.25 |
| 销售1部 | 1002 | 2024/5/16 | 张一 | 18 | 500 | 9000 | 5006.25 |
| 销售1部 | 1001 | 2024/5/2 | 张一 | 20 | 200 | 4000 | 5006.25 |
| 销售1部 | 1001 | 2024/5/30 | 王明 | 16 | 200 | 3200 | 5006.25 |
| 销售1部 | 1002 | 2024/5/18 | 张一 | 30 | 500 | 15000 | 5006.25 |
| 销售1部 | 1002 | 2024/5/11 | 张一 | 10 | 500 | 5000 | 5006.25 |
| 销售1部 | 1001 | 2024/5/14 | 张一 | 25 | 200 | 5000 | 5006.25 |
| 销售1部 | 1001 | 2024/5/11 | 张一 | 22 | 200 | 4400 | 5006.25 |
| 销售1部 | 1001 | 2024/5/16 | 张一 | 14 | 200 | 2800 | 5006.25 |
| 销售1部 | 1001 | 2024/5/4 | 王明 | 17 | 200 | 3400 | 5006.25 |
| 销售2部 | 1002 | 2024/5/10 | 徐小小 | 20 | 500 | 10000 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/6 | 刘阳 | 13 | 500 | 6500 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/12 | 徐小小 | 25 | 500 | 12500 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/13 | 刘阳 | 9 | 500 | 4500 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/25 | 徐小小 | 22 | 500 | 11000 | 11705.55556 |
| 销售2部 | 1003 | 2024/5/15 | 徐小小 | 8 | 1000 | 8000 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/1 | 徐小小 | 14 | 500 | 7000 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/9 | 刘阳 | 10 | 500 | 5000 | 11705.55556 |
| 销售2部 | 1001 | 2024/5/7 | 徐小小 | 21 | 200 | 4200 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/28 | 刘阳 | 11 | 500 | 5500 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/31 | 刘阳 | 18 | 500 | 9000 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/24 | 刘阳 | 24 | 500 | 12000 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/19 | 刘阳 | 8 | 500 | 4000 | 11705.55556 |
| 销售2部 | 1003 | 2024/5/22 | 刘阳 | 7 | 1000 | 7000 | 11705.55556 |
| 销售2部 | 1003 | 2024/5/23 | 刘阳 | 20 | 1000 | 20000 | 11705.55556 |
| 销售2部 | 1002 | 2024/5/3 | 刘阳 | 19 | 500 | 9500 | 11705.55556 |
| 销售2部 | 1003 | 2024/5/25 | 刘阳 | 25 | 1000 | 25000 | 11705.55556 |
| 销售2部 | 1003 | 2024/5/9 | 刘阳 | 50 | 1000 | 50000 | 11705.55556 |
| 销售3部 | 1001 | 2024/5/20 | 纪风 | 18 | 200 | 3600 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/12 | 付华 | 17 | 1000 | 17000 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/22 | 纪风 | 19 | 1000 | 19000 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/27 | 付华 | 16 | 1000 | 16000 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/17 | 纪风 | 24 | 1000 | 24000 | 13186.66667 |
| 销售3部 | 1001 | 2024/5/9 | 付华 | 13 | 200 | 2600 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/24 | 付华 | 12 | 1000 | 12000 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/21 | 纪风 | 23 | 1000 | 23000 | 13186.66667 |
| 销售3部 | 1001 | 2024/5/1 | 付华 | 10 | 200 | 2000 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/23 | 付华 | 18 | 1000 | 18000 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/26 | 付华 | 30 | 1000 | 30000 | 13186.66667 |
| 销售3部 | 1001 | 2024/5/2 | 付华 | 18 | 200 | 3600 | 13186.66667 |
| 销售3部 | 1003 | 2024/5/20 | 付华 | 21 | 1000 | 21000 | 13186.66667 |
| 销售3部 | 1002 | 2024/5/18 | 纪风 | 10 | 500 | 5000 | 13186.66667 |
| 销售3部 | 1001 | 2024/5/10 | 付华 | 5 | 200 | 1000 | 13186.66667 |
+-------+--------+-----------+------+------------+------+------+--------+
求和:SUM():
查询每个产品的销售总额:
SELECT product, SUM(quantity*unit_price) AS sale FROM sales GROUP BY product;
+-------+--------+-----------+------+------------+------+------+--------+
| product | sale |
| 1001 | 56600 |
| 1002 | 142000 |
| 1003 | 290000 |
+-------+--------+-----------+------+------------+------+------+--------+
求排名:
- row_number(): 显示分区中不重复不间断的序号
- dense_rank(): 显示分区中重复不间断的序号
- rank() 显示分区中重复间断的序号
计算每个产品在每个日期的销售量排名:
SELECT product,quantity,unit_price,sale_date,RANK() OVER (PARTITION BY sale_date, product ORDER BY quantity DESC) AS sale_rank FROM sales ORDER BY sale_date, product, quantity DESC;
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
| product | quantity | unit_price | sale_date | sales_rank |
| 1001 | 10 | 200 | 2024/5/1 | 1 |
| 1002 | 14 | 500 | 2024/5/1 | 1 |
| 1001 | 20 | 200 | 2024/5/2 | 1 |
| 1001 | 18 | 200 | 2024/5/2 | 2 |
| 1001 | 15 | 200 | 2024/5/3 | 1 |
| 1002 | 19 | 500 | 2024/5/3 | 1 |
| 1001 | 17 | 200 | 2024/5/4 | 1 |
| 1001 | 30 | 200 | 2024/5/5 | 1 |
| 1002 | 23 | 500 | 2024/5/5 | 1 |
| 1002 | 13 | 500 | 2024/5/6 | 1 |
| 1001 | 21 | 200 | 2024/5/7 | 1 |
| 1001 | 11 | 200 | 2024/5/7 | 2 |
| 1001 | 12 | 200 | 2024/5/8 | 1 |
| 1001 | 13 | 200 | 2024/5/9 | 1 |
| 1002 | 10 | 500 | 2024/5/9 | 1 |
| 1003 | 50 | 1000 | 2024/5/9 | 1 |
| 1001 | 5 | 200 | 2024/5/10 | 1 |
| 1002 | 20 | 500 | 2024/5/10 | 1 |
| 1001 | 22 | 200 | 2024/5/11 | 1 |
| 1002 | 10 | 500 | 2024/5/11 | 1 |
| 1002 | 25 | 500 | 2024/5/12 | 1 |
| 1003 | 17 | 1000 | 2024/5/12 | 1 |
| 1002 | 9 | 500 | 2024/5/13 | 1 |
| 1001 | 25 | 200 | 2024/5/14 | 1 |
| 1003 | 8 | 1000 | 2024/5/15 | 1 |
| 1001 | 14 | 200 | 2024/5/16 | 1 |
| 1002 | 18 | 500 | 2024/5/16 | 1 |
| 1003 | 24 | 1000 | 2024/5/17 | 1 |
| 1002 | 30 | 500 | 2024/5/18 | 1 |
| 1002 | 10 | 500 | 2024/5/18 | 2 |
| 1002 | 8 | 500 | 2024/5/19 | 1 |
| 1001 | 18 | 200 | 2024/5/20 | 1 |
| 1003 | 21 | 1000 | 2024/5/20 | 1 |
| 1003 | 23 | 1000 | 2024/5/21 | 1 |
| 1003 | 19 | 1000 | 2024/5/22 | 1 |
| 1003 | 7 | 1000 | 2024/5/22 | 2 |
| 1003 | 20 | 1000 | 2024/5/23 | 1 |
| 1003 | 18 | 1000 | 2024/5/23 | 2 |
| 1002 | 24 | 500 | 2024/5/24 | 1 |
| 1003 | 12 | 1000 | 2024/5/24 | 1 |
| 1002 | 22 | 500 | 2024/5/25 | 1 |
| 1003 | 25 | 1000 | 2024/5/25 | 1 |
| 1003 | 30 | 1000 | 2024/5/26 | 1 |
| 1003 | 16 | 1000 | 2024/5/27 | 1 |
| 1002 | 11 | 500 | 2024/5/28 | 1 |
| 1001 | 9 | 200 | 2024/5/29 | 1 |
| 1001 | 7 | 200 | 2024/5/29 | 2 |
| 1001 | 16 | 200 | 2024/5/30 | 1 |
| 1002 | 18 | 500 | 2024/5/31 | 1 |
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
移动平均
计算每个产品的移动平均销售额(最近3个订单):
SELECTproduct,quantity*unit_price sale,sale_date,AVG(quantity*unit_price) OVER (PARTITION BY product ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_sale
FROM sales
ORDER BY product, sale_date;
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
| product | sale | sale_date | moving_avg_sale |
| 1001 | 2000 | 2024/5/1 | 2000 |
| 1001 | 3600 | 2024/5/2 | 2800 |
| 1001 | 4000 | 2024/5/2 | 3200 |
| 1001 | 3000 | 2024/5/3 | 3533.333333 |
| 1001 | 3400 | 2024/5/4 | 3466.666667 |
| 1001 | 6000 | 2024/5/5 | 4133.333333 |
| 1001 | 2200 | 2024/5/7 | 3866.666667 |
| 1001 | 4200 | 2024/5/7 | 4133.333333 |
| 1001 | 2400 | 2024/5/8 | 2933.333333 |
| 1001 | 2600 | 2024/5/9 | 3066.666667 |
| 1001 | 1000 | 2024/5/10 | 2000 |
| 1001 | 4400 | 2024/5/11 | 2666.666667 |
| 1001 | 5000 | 2024/5/14 | 3466.666667 |
| 1001 | 2800 | 2024/5/16 | 4066.666667 |
| 1001 | 3600 | 2024/5/20 | 3800 |
| 1001 | 1400 | 2024/5/29 | 2600 |
| 1001 | 1800 | 2024/5/29 | 2266.666667 |
| 1001 | 3200 | 2024/5/30 | 2133.333333 |
| 1002 | 7000 | 2024/5/1 | 7000 |
| 1002 | 9500 | 2024/5/3 | 8250 |
| 1002 | 11500 | 2024/5/5 | 9333.333333 |
| 1002 | 6500 | 2024/5/6 | 9166.666667 |
| 1002 | 5000 | 2024/5/9 | 7666.666667 |
| 1002 | 10000 | 2024/5/10 | 7166.666667 |
| 1002 | 5000 | 2024/5/11 | 6666.666667 |
| 1002 | 12500 | 2024/5/12 | 9166.666667 |
| 1002 | 4500 | 2024/5/13 | 7333.333333 |
| 1002 | 9000 | 2024/5/16 | 8666.666667 |
| 1002 | 5000 | 2024/5/18 | 6166.666667 |
| 1002 | 15000 | 2024/5/18 | 9666.666667 |
| 1002 | 4000 | 2024/5/19 | 8000 |
| 1002 | 12000 | 2024/5/24 | 10333.33333 |
| 1002 | 11000 | 2024/5/25 | 9000 |
| 1002 | 5500 | 2024/5/28 | 9500 |
| 1002 | 9000 | 2024/5/31 | 8500 |
| 1003 | 50000 | 2024/5/9 | 50000 |
| 1003 | 17000 | 2024/5/12 | 33500 |
| 1003 | 8000 | 2024/5/15 | 25000 |
| 1003 | 24000 | 2024/5/17 | 16333.33333 |
| 1003 | 21000 | 2024/5/20 | 17666.66667 |
| 1003 | 23000 | 2024/5/21 | 22666.66667 |
| 1003 | 19000 | 2024/5/22 | 21000 |
| 1003 | 7000 | 2024/5/22 | 16333.33333 |
| 1003 | 18000 | 2024/5/23 | 14666.66667 |
| 1003 | 20000 | 2024/5/23 | 15000 |
| 1003 | 12000 | 2024/5/24 | 16666.66667 |
| 1003 | 25000 | 2024/5/25 | 19000 |
| 1003 | 30000 | 2024/5/26 | 22333.33333 |
| 1003 | 16000 | 2024/5/27 | 23666.66667 |
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
计数COUNT():
示例: 计算每个部门的销售记录总和:
SELECTdepartment,COUNT(1) OVER (PARTITION BY department) AS total_sales_count
FROM sales;
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
| department | total_sales_count |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售1部 | 16 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售2部 | 18 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
| 销售3部 | 15 |
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
求最大MXA()/小MIN()值
示例: 查找每个部门在销售日期的最大销售数量:
SELECTdepartment,sale_date,quantity,MAX(quantity) OVER (PARTITION BY department, sale_date) AS max_quantity_on_date
FROM sales;
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
| department | sale_date | quantity | max_quantity_on_date |
| 销售1部 | 2024/5/2 | 20 | 20 |
| 销售1部 | 2024/5/3 | 15 | 15 |
| 销售1部 | 2024/5/4 | 17 | 17 |
| 销售1部 | 2024/5/5 | 30 | 30 |
| 销售1部 | 2024/5/5 | 23 | 30 |
| 销售1部 | 2024/5/7 | 11 | 11 |
| 销售1部 | 2024/5/8 | 12 | 12 |
| 销售1部 | 2024/5/11 | 22 | 22 |
| 销售1部 | 2024/5/11 | 10 | 22 |
| 销售1部 | 2024/5/14 | 25 | 25 |
| 销售1部 | 2024/5/16 | 14 | 18 |
| 销售1部 | 2024/5/16 | 18 | 18 |
| 销售1部 | 2024/5/18 | 30 | 30 |
| 销售1部 | 2024/5/29 | 7 | 9 |
| 销售1部 | 2024/5/29 | 9 | 9 |
| 销售1部 | 2024/5/30 | 16 | 16 |
| 销售2部 | 2024/5/1 | 14 | 14 |
| 销售2部 | 2024/5/3 | 19 | 19 |
| 销售2部 | 2024/5/6 | 13 | 13 |
| 销售2部 | 2024/5/7 | 21 | 21 |
| 销售2部 | 2024/5/9 | 10 | 50 |
| 销售2部 | 2024/5/9 | 50 | 50 |
| 销售2部 | 2024/5/10 | 20 | 20 |
| 销售2部 | 2024/5/12 | 25 | 25 |
| 销售2部 | 2024/5/13 | 9 | 9 |
| 销售2部 | 2024/5/15 | 8 | 8 |
| 销售2部 | 2024/5/19 | 8 | 8 |
| 销售2部 | 2024/5/22 | 7 | 7 |
| 销售2部 | 2024/5/23 | 20 | 20 |
| 销售2部 | 2024/5/24 | 24 | 24 |
| 销售2部 | 2024/5/25 | 22 | 25 |
| 销售2部 | 2024/5/25 | 25 | 25 |
| 销售2部 | 2024/5/28 | 11 | 11 |
| 销售2部 | 2024/5/31 | 18 | 18 |
| 销售3部 | 2024/5/1 | 10 | 10 |
| 销售3部 | 2024/5/2 | 18 | 18 |
| 销售3部 | 2024/5/9 | 13 | 13 |
| 销售3部 | 2024/5/10 | 5 | 5 |
| 销售3部 | 2024/5/12 | 17 | 17 |
| 销售3部 | 2024/5/17 | 24 | 24 |
| 销售3部 | 2024/5/18 | 10 | 10 |
| 销售3部 | 2024/5/20 | 18 | 21 |
| 销售3部 | 2024/5/20 | 21 | 21 |
| 销售3部 | 2024/5/21 | 23 | 23 |
| 销售3部 | 2024/5/22 | 19 | 19 |
| 销售3部 | 2024/5/23 | 18 | 18 |
| 销售3部 | 2024/5/24 | 12 | 12 |
| 销售3部 | 2024/5/26 | 30 | 30 |
| 销售3部 | 2024/5/27 | 16 | 16 |
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
示例: 查找每个部门在销售日期的最小销售数量:
SELECTdepartment,sale_date,quantity,MAX(quantity) OVER (PARTITION BY department, sale_date) AS max_quantity_on_date
FROM sales;
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
| department | sale_date | quantity | min_quantity_on_date |
| 销售1部 | 2024/5/2 | 20 | 20 |
| 销售1部 | 2024/5/3 | 15 | 15 |
| 销售1部 | 2024/5/4 | 17 | 17 |
| 销售1部 | 2024/5/5 | 30 | 23 |
| 销售1部 | 2024/5/5 | 23 | 23 |
| 销售1部 | 2024/5/7 | 11 | 11 |
| 销售1部 | 2024/5/8 | 12 | 12 |
| 销售1部 | 2024/5/11 | 22 | 10 |
| 销售1部 | 2024/5/11 | 10 | 10 |
| 销售1部 | 2024/5/14 | 25 | 25 |
| 销售1部 | 2024/5/16 | 14 | 14 |
| 销售1部 | 2024/5/16 | 18 | 14 |
| 销售1部 | 2024/5/18 | 30 | 30 |
| 销售1部 | 2024/5/29 | 7 | 7 |
| 销售1部 | 2024/5/29 | 9 | 7 |
| 销售1部 | 2024/5/30 | 16 | 16 |
| 销售2部 | 2024/5/1 | 14 | 14 |
| 销售2部 | 2024/5/3 | 19 | 19 |
| 销售2部 | 2024/5/6 | 13 | 13 |
| 销售2部 | 2024/5/7 | 21 | 21 |
| 销售2部 | 2024/5/9 | 10 | 10 |
| 销售2部 | 2024/5/9 | 50 | 10 |
| 销售2部 | 2024/5/10 | 20 | 20 |
| 销售2部 | 2024/5/12 | 25 | 25 |
| 销售2部 | 2024/5/13 | 9 | 9 |
| 销售2部 | 2024/5/15 | 8 | 8 |
| 销售2部 | 2024/5/19 | 8 | 8 |
| 销售2部 | 2024/5/22 | 7 | 7 |
| 销售2部 | 2024/5/23 | 20 | 20 |
| 销售2部 | 2024/5/24 | 24 | 24 |
| 销售2部 | 2024/5/25 | 22 | 22 |
| 销售2部 | 2024/5/25 | 25 | 22 |
| 销售2部 | 2024/5/28 | 11 | 11 |
| 销售2部 | 2024/5/31 | 18 | 18 |
| 销售3部 | 2024/5/1 | 10 | 10 |
| 销售3部 | 2024/5/2 | 18 | 18 |
| 销售3部 | 2024/5/9 | 13 | 13 |
| 销售3部 | 2024/5/10 | 5 | 5 |
| 销售3部 | 2024/5/12 | 17 | 17 |
| 销售3部 | 2024/5/17 | 24 | 24 |
| 销售3部 | 2024/5/18 | 10 | 10 |
| 销售3部 | 2024/5/20 | 18 | 18 |
| 销售3部 | 2024/5/20 | 21 | 18 |
| 销售3部 | 2024/5/21 | 23 | 23 |
| 销售3部 | 2024/5/22 | 19 | 19 |
| 销售3部 | 2024/5/23 | 18 | 18 |
| 销售3部 | 2024/5/24 | 12 | 12 |
| 销售3部 | 2024/5/26 | 30 | 30 |
| 销售3部 | 2024/5/27 | 16 | 16 |
+-------+--------+-----------+------+------------+------+------+--------+-------
-----------+
求分区内的最大/最小值
- FIRST_VALUE() OVER(PARTITION BY … ORDER BY …):
作用: 返回在指定分区内按指定排序顺序的第一个值。
应用: 常用于找出每个分组内的第一个值。
示例: 找出每个部门的最早销售日期:
SELECTdepartment,sale_date,FIRST_VALUE(sale_date) OVER (PARTITION BY department ORDER BY sale_date) AS first_sale_date
FROM sales;
+-------+--------+-----------+------+------------+------+------+--------+
| department | sale_date | first_sale_date |
| 销售1部 | 2024/5/2 | 2024/5/2 |
| 销售1部 | 2024/5/3 | 2024/5/2 |
| 销售1部 | 2024/5/4 | 2024/5/2 |
| 销售1部 | 2024/5/5 | 2024/5/2 |
| 销售1部 | 2024/5/5 | 2024/5/2 |
| 销售1部 | 2024/5/7 | 2024/5/2 |
| 销售1部 | 2024/5/8 | 2024/5/2 |
| 销售1部 | 2024/5/11 | 2024/5/2 |
| 销售1部 | 2024/5/11 | 2024/5/2 |
| 销售1部 | 2024/5/14 | 2024/5/2 |
| 销售1部 | 2024/5/16 | 2024/5/2 |
| 销售1部 | 2024/5/16 | 2024/5/2 |
| 销售1部 | 2024/5/18 | 2024/5/2 |
| 销售1部 | 2024/5/29 | 2024/5/2 |
| 销售1部 | 2024/5/29 | 2024/5/2 |
| 销售1部 | 2024/5/30 | 2024/5/2 |
| 销售2部 | 2024/5/1 | 2024/5/1 |
| 销售2部 | 2024/5/3 | 2024/5/1 |
| 销售2部 | 2024/5/6 | 2024/5/1 |
| 销售2部 | 2024/5/7 | 2024/5/1 |
| 销售2部 | 2024/5/9 | 2024/5/1 |
| 销售2部 | 2024/5/9 | 2024/5/1 |
| 销售2部 | 2024/5/10 | 2024/5/1 |
| 销售2部 | 2024/5/12 | 2024/5/1 |
| 销售2部 | 2024/5/13 | 2024/5/1 |
| 销售2部 | 2024/5/15 | 2024/5/1 |
| 销售2部 | 2024/5/19 | 2024/5/1 |
| 销售2部 | 2024/5/22 | 2024/5/1 |
| 销售2部 | 2024/5/23 | 2024/5/1 |
| 销售2部 | 2024/5/24 | 2024/5/1 |
| 销售2部 | 2024/5/25 | 2024/5/1 |
| 销售2部 | 2024/5/25 | 2024/5/1 |
| 销售2部 | 2024/5/28 | 2024/5/1 |
| 销售2部 | 2024/5/31 | 2024/5/1 |
| 销售3部 | 2024/5/1 | 2024/5/1 |
| 销售3部 | 2024/5/2 | 2024/5/1 |
| 销售3部 | 2024/5/9 | 2024/5/1 |
| 销售3部 | 2024/5/10 | 2024/5/1 |
| 销售3部 | 2024/5/12 | 2024/5/1 |
| 销售3部 | 2024/5/17 | 2024/5/1 |
| 销售3部 | 2024/5/18 | 2024/5/1 |
| 销售3部 | 2024/5/20 | 2024/5/1 |
| 销售3部 | 2024/5/20 | 2024/5/1 |
| 销售3部 | 2024/5/21 | 2024/5/1 |
| 销售3部 | 2024/5/22 | 2024/5/1 |
| 销售3部 | 2024/5/23 | 2024/5/1 |
| 销售3部 | 2024/5/24 | 2024/5/1 |
| 销售3部 | 2024/5/26 | 2024/5/1 |
| 销售3部 | 2024/5/27 | 2024/5/1 |
+-------+--------+-----------+------+------------+------+------+--------+
- LAST_VALUE() OVER(PARTITION BY … ORDER BY …):
作用: 返回在指定分区内按指定排序顺序的最后一个值。
应用: 由于 MySQL 中并没有内置的 LAST_VALUE 函数,可以通过 ROW_NUMBER 窗口函数先给每行分配一个序号,然后利用 MAX() 函数结合 CASE 表达式来实现类似功能。
示例: 找出每个部门的最晚销售日期:
SELECTdepartment,sale_date,LAST_VALUE(sale_date) OVER (PARTITION BY department ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_date
FROM sales;
+-------+--------+-----------+------+------------+------+------+--------+
| department | sale_date | last_sale_date |
| 销售1部 | 2024/5/2 | 2024/5/30 |
| 销售1部 | 2024/5/3 | 2024/5/30 |
| 销售1部 | 2024/5/4 | 2024/5/30 |
| 销售1部 | 2024/5/5 | 2024/5/30 |
| 销售1部 | 2024/5/5 | 2024/5/30 |
| 销售1部 | 2024/5/7 | 2024/5/30 |
| 销售1部 | 2024/5/8 | 2024/5/30 |
| 销售1部 | 2024/5/11 | 2024/5/30 |
| 销售1部 | 2024/5/11 | 2024/5/30 |
| 销售1部 | 2024/5/14 | 2024/5/30 |
| 销售1部 | 2024/5/16 | 2024/5/30 |
| 销售1部 | 2024/5/16 | 2024/5/30 |
| 销售1部 | 2024/5/18 | 2024/5/30 |
| 销售1部 | 2024/5/29 | 2024/5/30 |
| 销售1部 | 2024/5/29 | 2024/5/30 |
| 销售1部 | 2024/5/30 | 2024/5/30 |
| 销售2部 | 2024/5/1 | 2024/5/31 |
| 销售2部 | 2024/5/3 | 2024/5/31 |
| 销售2部 | 2024/5/6 | 2024/5/31 |
| 销售2部 | 2024/5/7 | 2024/5/31 |
| 销售2部 | 2024/5/9 | 2024/5/31 |
| 销售2部 | 2024/5/9 | 2024/5/31 |
| 销售2部 | 2024/5/10 | 2024/5/31 |
| 销售2部 | 2024/5/12 | 2024/5/31 |
| 销售2部 | 2024/5/13 | 2024/5/31 |
| 销售2部 | 2024/5/15 | 2024/5/31 |
| 销售2部 | 2024/5/19 | 2024/5/31 |
| 销售2部 | 2024/5/22 | 2024/5/31 |
| 销售2部 | 2024/5/23 | 2024/5/31 |
| 销售2部 | 2024/5/24 | 2024/5/31 |
| 销售2部 | 2024/5/25 | 2024/5/31 |
| 销售2部 | 2024/5/25 | 2024/5/31 |
| 销售2部 | 2024/5/28 | 2024/5/31 |
| 销售2部 | 2024/5/31 | 2024/5/31 |
| 销售3部 | 2024/5/1 | 2024/5/27 |
| 销售3部 | 2024/5/2 | 2024/5/27 |
| 销售3部 | 2024/5/9 | 2024/5/27 |
| 销售3部 | 2024/5/10 | 2024/5/27 |
| 销售3部 | 2024/5/12 | 2024/5/27 |
| 销售3部 | 2024/5/17 | 2024/5/27 |
| 销售3部 | 2024/5/18 | 2024/5/27 |
| 销售3部 | 2024/5/20 | 2024/5/27 |
| 销售3部 | 2024/5/20 | 2024/5/27 |
| 销售3部 | 2024/5/21 | 2024/5/27 |
| 销售3部 | 2024/5/22 | 2024/5/27 |
| 销售3部 | 2024/5/23 | 2024/5/27 |
| 销售3部 | 2024/5/24 | 2024/5/27 |
| 销售3部 | 2024/5/26 | 2024/5/27 |
| 销售3部 | 2024/5/27 | 2024/5/27 |
+-------+--------+-----------+------+------------+------+------+--------+
求当前行的前/后一个值
- LAG() OVER(PARTITION BY … ORDER BY …):
作用: 用于获取指定列在指定排序顺序下的前一个值。
应用: 常用于比较相邻行的值。
示例: 找出销售量比上一次销售量增加的产品:
select * from (
select department,product,sale_date,quantity,LAG(quantity) OVER (PARTITION BY department, product ORDER BY sale_date) AS previous_quantity
FROM sales ) t1
where quantity > previous_quantity;
+-------+--------+-----------+------+------------+------+------+--------+
| department | product | sale_date | quantity | previous_quantity |
| 销售1部 | 1001 | 2024/5/4 | 17 | 15 |
| 销售1部 | 1001 | 2024/5/5 | 30 | 17 |
| 销售1部 | 1001 | 2024/5/8 | 12 | 11 |
| 销售1部 | 1001 | 2024/5/11 | 22 | 12 |
| 销售1部 | 1001 | 2024/5/14 | 25 | 22 |
| 销售1部 | 1001 | 2024/5/30 | 16 | 7 |
| 销售1部 | 1002 | 2024/5/16 | 18 | 10 |
| 销售1部 | 1002 | 2024/5/18 | 30 | 18 |
| 销售2部 | 1002 | 2024/5/3 | 19 | 14 |
| 销售2部 | 1002 | 2024/5/10 | 20 | 10 |
| 销售2部 | 1002 | 2024/5/12 | 25 | 20 |
| 销售2部 | 1002 | 2024/5/24 | 24 | 8 |
| 销售2部 | 1002 | 2024/5/31 | 18 | 11 |
| 销售2部 | 1003 | 2024/5/23 | 20 | 7 |
| 销售2部 | 1003 | 2024/5/25 | 25 | 20 |
| 销售3部 | 1001 | 2024/5/2 | 18 | 10 |
| 销售3部 | 1001 | 2024/5/20 | 18 | 5 |
| 销售3部 | 1003 | 2024/5/17 | 24 | 17 |
| 销售3部 | 1003 | 2024/5/21 | 23 | 21 |
| 销售3部 | 1003 | 2024/5/26 | 30 | 12 |
+-------+--------+-----------+------+------------+------+------+--------+
- LEAD() OVER(PARTITION BY … ORDER BY …):
作用: 用于获取指定列在指定排序顺序下的后一个值。
应用: 常用于比较相邻行的值。
示例: 找出下一次销售量较本次销量减少的产品:
select * from (
selectdepartment,product,sale_date,quantity,LEAD(quantity) OVER (PARTITION BY department, product ORDER BY sale_date) AS next_quantity
FROM sales
) t1
where quantity > next_quantity;
+-------+--------+-----------+------+------------+------+------+--------+
| department | product | sale_date | quantity | next_quantity |
| 销售1部 | 1001 | 2024/5/2 | 20 | 15 |
| 销售1部 | 1001 | 2024/5/5 | 30 | 11 |
| 销售1部 | 1001 | 2024/5/14 | 25 | 14 |
| 销售1部 | 1001 | 2024/5/16 | 14 | 9 |
| 销售1部 | 1001 | 2024/5/29 | 9 | 7 |
| 销售1部 | 1002 | 2024/5/5 | 23 | 10 |
| 销售2部 | 1002 | 2024/5/3 | 19 | 13 |
| 销售2部 | 1002 | 2024/5/6 | 13 | 10 |
| 销售2部 | 1002 | 2024/5/12 | 25 | 9 |
| 销售2部 | 1002 | 2024/5/13 | 9 | 8 |
| 销售2部 | 1002 | 2024/5/24 | 24 | 22 |
| 销售2部 | 1002 | 2024/5/25 | 22 | 11 |
| 销售2部 | 1003 | 2024/5/9 | 50 | 8 |
| 销售2部 | 1003 | 2024/5/15 | 8 | 7 |
| 销售3部 | 1001 | 2024/5/2 | 18 | 13 |
| 销售3部 | 1001 | 2024/5/9 | 13 | 5 |
| 销售3部 | 1003 | 2024/5/17 | 24 | 21 |
| 销售3部 | 1003 | 2024/5/21 | 23 | 19 |
| 销售3部 | 1003 | 2024/5/22 | 19 | 18 |
| 销售3部 | 1003 | 2024/5/23 | 18 | 12 |
| 销售3部 | 1003 | 2024/5/26 | 30 | 16 |
+-------+--------+-----------+------+------------+------+------+--------+
相关文章:

SQL开窗函数
文章目录 概念:语法:常用的窗口函数及示例:求平均值:AVG() :求和:SUM():求排名:移动平均计数COUNT():求最大MXA()/小MIN()值求分区内的最大/最小值求当前行的前/后一个值 概念: 开窗…...

[xx点评完结]——白马点评完整代码+rabbitmq实现异步下单+资料,免费
项目所有功能已测,均可以跑通,Jmeter和RabbitMQ也都测了。 项目源码:dianpinghui: 仿黑马点评项目 资料: https://pan.baidu.com/s/1kTCn9PxgeIey90WgM4KRqA?pwdn66b 对佬有帮助可以给个star哈,感谢🌹🌹dz…...

Hadoop+Spark大数据技术 实验8 Spark SQL结构化
9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…...
认知V2X的技术列一个学习大纲
为了深入学习和理解V2X(Vehicle to Everything)技术,以下是一个学习大纲的概述,结合了参考文章中的相关数字和信息: 一、V2X技术基础 V2X概述 定义:V2X是车用无线通信技术,将车辆与一切事物相连…...

揭秘齿轮加工工艺的选用原则:精准打造高效传动的秘密武器
在机械制造领域,齿轮作为传动系统中的重要组成部分,其加工工艺的选择至关重要。不同的齿轮加工工艺会影响齿轮的精度、耐用性和效率。本文将通过递进式结构,深入探讨齿轮加工工艺的选用原则,带您了解如何精准打造高效传动的秘密武…...

Linux-应用编程学习笔记(二、文件I/O、标准I/O)
一、文件I/O基础 文件 I/O 指的是对文件的输入/输出操作,就是对文件的读写操作。Linux 下一切皆文件。 1.1 文件描述符 在 open函数执行成功的情况下, 会返回一个非负整数, 该返回值就是一个文件描述符(file descriptor&#x…...

AI爆文写作:根据别人的爆款标题,如何通过名词替换改成自己的爆款标题?
在日常刷到爆文的时候,就可以培养自己的网感,为啥这篇文章会爆? 这篇爆文的标题有啥诀窍呢? 比如下面这一篇:《极简生活:变富就是每天循环5个动作》 我们可以发现,每天循环5个动作 这几个词语…...

Mybatis源码剖析---第二讲
Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类,它的一个核心作用之后呢?那下面我有一个问题想问问各位。作为mappedstatement来讲,它封装的是一个select标签或者insert标签。但是呢,我们需要大家注意的是什么&am…...

SpringMvc-restful设计风格
Restful 1、入门1.1 简介1.2 实例 1、入门 1.1 简介 RESTFul是什么 RESTFul是WEB服务接口的一种设计风格。 RESTFul定义了一组约束条件和规范,可以让WEB服务接口更加简洁、易于理解、易于扩展、安全可靠。 1.2 实例 web.xml <?xml version"1.0"…...

在未来你将何去何从?
在数字化的浪潮中,信息技术行业无疑是推动全球经济和社会发展的重要动力。随着科技的不断迭代与进步,云计算、大数据、人工智能(AI)、物联网(IoT)、5G通信和区块链等技术已经深入到我们生活的每一个角落&am…...
Vue.js组件设计模式:构建可复用组件库
在Vue.js中,构建可复用的组件库是提高代码复用性和维护性的关键。下面是一些设计模式,说明如何创建可复用的Vue组件: 1. 单文件组件(Single File Component, SFC) Vue.js组件通常是单文件组件,包含HTML、…...

【C语言】指针运算
前言 前面在“走进指针世界”中我已经讲解过指针相关的很多前置知识,其实还有一个很重要的部分就是指针的运算。这篇博客,就让我们一起了解一下指针的运算吧! 指针作为变量,是可以进行算术运算的,只不过情况会和整型…...
Python学习(3) 函数
定义 定义一个函数的格式: def 函数名(参数):执行代码如果没有参数,则称为无参函数。 定义时小括号中写的是形参(形式参数),调用时写的是实参(实际参数)。 调用 调用格式: def…...

计算机网络安全控制技术
1.防火墙技术 防火墙技术是近年来维护网络安全最重要的手段,但是防火墙不是万能的,需要配合其他安全措施来协同 2.加密技术 目前加密技术主要有两大类:对称加密和非对称加密 3.用户识别技术 核心是识别网络者是否是属于系统的合法用户 …...

WordPress插件Disable WP REST API,可根据是否登录来禁用REST API
前面跟大家分享了代码版禁用WordPress REST API的方法(详见『WordPress4.7以上版本如何禁用JSON REST API?』),不过有些站长不太敢折腾自己的网站代码,那么建议试试这款Disable WP REST API,它可以…...

腾讯云COS上传文件出现的问题
1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…...

【C++】<知识点> 标准和文件的输入输出
目录 一、输入输出操作 1. 相关的类 2. 标准流对象 3. istream类的成员函数 二、流操纵算子 1. 整数流的基数 2. 浮点数精度的流操纵算子 3. 域宽的流操纵算子 4. 其他的流操纵算子 5. 用户自定义流操纵算子 三、文件读写 1. 文本文件的读写 2. 二进制文件的读写 3. 文件读写…...
在阿里Anolis OS 8.9龙蜥操作系统安装docker
在Anolis OS 8系统安装docker 1.更新系统 sudo dnf update -y2.安装依赖包 sudo dnf install -y yum-utils device-mapper-persistent-data lvm23.添加Docker的官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4.安装…...

短剧APP开发,短剧行业发展下的财富密码
今年以来,短剧市场展现出了繁荣发展的态势,成为了一个风口赛道。 短剧具有不拖沓、时长短、剧情紧凑等优势,顺应了当代人的生活,是当代人的“电子榨菜”。 短剧的快速发展同时也带动了新业态新模式的发展,短剧APP就是…...
简述分代垃圾回收器是怎么工作的?
分代垃圾回收器是一种用于管理和回收内存中垃圾对象的技术。它根据对象的存活时间将内存分为不同的代,并针对每个代应用不同的垃圾回收策略。 分代垃圾回收器的工作过程如下: 内存分代:首先,将内存分为不同的代,通常是…...
Qt 自定义代理类
一.使用步骤 继承QStyledItemDelegate类:首先创建一个新的类并继承自QStyledItemDelegate类,作为您的自定义代理类。 实现代理类的构造函数:在代理类中实现构造函数,并在构造函数中调用基类的构造函数,可以选择传入一…...
android GridLayout 布局详解,并举例
GridLayout 是 Android 中的一个布局容器,它允许你在一个二维网格中排列子视图。你可以指定网格的行数和列数,或者让 GridLayout 自动计算它们。每个子视图都可以占据一个或多个网格单元格。GridLayout 非常适合在需要创建规则网格的应用中使用ÿ…...

el-transfer和el-tree进行结合搞一个树形穿梭框
由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。 目录 1.拷贝代码放到自己的项目目录中 2.改造el-transfer的源码 3.修改tree-transfer-panel.vue文件 4.修改…...

编一个自己的万年历
编一个自己的万年历 前阶段突然想查一下某一天是星期几,于是自己编了一个[小程序][https://blog.csdn.net/weixin_41905135/article/details/138972055?spm1001.2014.3001.5501],但是功能很单一,就是单纯的查是星期几。(虽然用网…...
Golang gin框架中间件c.JSON返回结果后终止返回
gin框架中间件c.JSON返回结果后还是会继续执行之后的方法,我们可以用c.Abort()来终止后续的处理 func MiddlewareFunction(c *gin.Context) {// 假设有某种条件下需要返回错误if someCondition {c.JSON(http.StatusBadRequest, gin.H{"error": "som…...

码蹄集部分题目(2024OJ赛16期;单调栈集训+差分集训)
🧀🧀🧀单调栈集训 🥪单调栈 单调递增栈伪代码: stack<int> st; for(遍历数组) {while(栈不为空&&栈顶元素大于当前元素)//单调递减栈就是把后方判断条件变为小于等于即可{栈顶元素出栈;//同时进行其他…...

安卓玩机搞机技巧综合资源----自己手机制作证件照的几种方法 免费制作证件照
接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…...

揭秘循环购模式:消费返利新玩法,引领电商新潮流
在当今的消费市场中,有一种商业模式引起了广大消费者的热烈讨论——那就是循环购模式。你可能会想,消费满千元就能得到两千元的福利,每天还能领取现金,这怎么可能呢?商家难道真的在“慷慨解囊”?今天&#…...

【制作100个unity游戏之26】unity2d横版卷轴动作类游13(附带项目源码)
最终效果 系列导航 文章目录 最终效果系列导航前言存储点灯光后处理存储位置信息存储更多数据存储场景信息持久化存储数据引入Unity 的可序列化字典类调用 游戏结束源码完结 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各…...
Golang使用HTTP框架zdpgo_resty实现文件下载
核心代码 代码解析: client.SetOutputDirectory("Downloads") 设置下载目录client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下载文件名并进行下载 // 设置输出目录路径,如果目录不存在ÿ…...