首页 > 试题广场 >

偏移窗口函数应用I

[编程题]偏移窗口函数应用I
  • 热度指数:36 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 得分表

+----------+---------+
| 字段名称     | 类型      |
+----------+---------+
| 球队名      | varchar |
| 球员姓名     | varchar |
| 得分时间_min | int     |
+----------+---------+

该表的每一行表示 一个球队中一名球员的得分时间,包含球队名、球员姓名和得分时间,得分时间单位为分钟。

 

编写一个 SQL 查询,对每个球队的得分时间从前到后排序,得出每个球员向上错1行、错2行的数据,字段有:球员姓名、球员错1行、球员错2行。

查询结果如下例所示。

 

示例 1:

输入: 表:得分表
+-----+------+----------+
| 球队名 | 球员姓名 | 得分时间_min |
+-----+------+----------+
| A   | A1   | 10       |
| A   | A5   | 19       |
| B   | B4   | 27       |
| A   | A4   | 39       |
| B   | B1   | 54       |
+-----+------+----------+ 输出: +------+-------+-------+
| 球员姓名 | 球员错1行 | 球员错2行 |
+------+-------+-------+
| A1   | A5    | A4    |
| A5   | A4    |       |
| A4   |       |       |
| B4   | B1    |       |
| B1   |       |       |
+------+-------+-------+ 解释: 向上错行问题使用向上偏移窗口函数lead(),语法为:lead(列名,偏移量N,默认值) over(partition by … order by …),默认值是指当向上偏移N行时,如果已经超出了表行和列的范围时,会将这个默认值作为函数的返回值,若没有指定默认值,则返回Null。
示例1

输入

CREATE TABLE `得分表` 
(
    `球队名` VARCHAR(512),
    `球员姓名` VARCHAR(512),
    `得分时间_min` INT
);
-- 插入第一组数据
INSERT INTO `得分表` (`球队名`, `球员姓名`, `得分时间_min`) VALUES ('A', 'A1', 10);
INSERT INTO `得分表` (`球队名`, `球员姓名`, `得分时间_min`) VALUES ('A', 'A5', 19);
INSERT INTO `得分表` (`球队名`, `球员姓名`, `得分时间_min`) VALUES ('B', 'B4', 27);
INSERT INTO `得分表` (`球队名`, `球员姓名`, `得分时间_min`) VALUES ('A', 'A4', 39);
INSERT INTO `得分表` (`球队名`, `球员姓名`, `得分时间_min`) VALUES ('B', 'B1', 54);

输出

球员姓名|球员错1行|球员错2行
A1|A5|A4
A5|A4|None
A4|None|None
B4|B1|None
B1|None|None
头像 牛客987852806号
发表于 2024-07-03 14:32:31
此题为:lead和lag的用法,lead向上移动,lag向下移动。 select 球员姓名, lead(球员姓名,1)over(partition by 球队名) as 球员错1行, lead(球员姓名,2)over(partition by 球队名) as 球员错2行 from 得分表