表: 得分表 +----------+---------+ 字段名称 类型 +----------+---------+ 球队名 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 A1 A4 A5 A1 B4 B1 B4 +------+-------+-------+ 解释: 向下错行问题使用向下偏移窗口函数lag(),语法为:lag(列名,偏移量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|None|None
A5|A1|None
A4|A5|A1
B4|None|None
B1|B4|None
加载中...