两支篮球队进行了激烈的比赛,比分交替上升。比赛结束后,你有一个两队分数的明细表
表中记录了球队、球员号码、球员姓名、得分分数及得分时间。现在球队要对比赛中表现突出的球员进行奖励。
问题:请你写一个SQL语句,统计出连续3次为球队得分的球员名单。
输入: 球员得分表 | 输出 | ||||||
TEAM_NAME | PLAYER_ID | PLAYER_NAME | SCORE | SCORE_TIME | TEAM_NAME | PLAYER_NAME | |
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 3 | 2023/12/25 10:00:00 | 金州勇士队 | 斯蒂芬·库里 | |
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 3 | 2023/12/25 10:15:00 | |||
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 1 | 2023/12/25 10:30:00 | 洛杉矶湖人队 | 勒布朗·詹姆斯 | |
洛杉矶湖人队 | 3 | 安东尼·戴维斯 | 2 | 2023/12/25 10:32:00 | |||
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 3 | 2023/12/25 10:45:00 | |||
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 3 | 2023/12/25 11:00:00 | |||
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 2 | 2023/12/25 11:15:00 | |||
洛杉矶湖人队 | 23 | 勒布朗·詹姆斯 | 2 | 2023/12/25 11:30:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 1 | 2023/12/25 10:10:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 1 | 2023/12/25 10:25:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 1 | 2023/12/25 10:40:00 | |||
金州勇士队 | 11 | 克莱·汤普森 | 2 | 2023/12/25 10:45:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 2 | 2023/12/25 10:55:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 2 | 2023/12/25 11:10:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 3 | 2023/12/25 11:25:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 3 | 2023/12/25 11:40:00 | |||
金州勇士队 | 30 | 斯蒂芬·库里 | 3 | 2023/12/25 11:55:00 |
建表语句:
-- 创建分数表,并为列名增加注释
drop table t_score;
CREATE TABLE t_score (
team_name VARCHAR2(50),
player_id INT,
player_name VARCHAR2(50),
score INT,
score_time TIMESTAMP
);
COMMENT ON COLUMN t_score.team_name IS '球队名称';
COMMENT ON COLUMN t_score.player_id IS '球员ID';
COMMENT ON COLUMN t_score.player_name IS '球员姓名';
COMMENT ON COLUMN t_score.score IS '得分';
COMMENT ON COLUMN t_score.score_time IS '得分时间';
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 3, TO_TIMESTAMP('2023-12-25 10:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 3, TO_TIMESTAMP('2023-12-25 10:15:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 1, TO_TIMESTAMP('2023-12-25 10:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 3, '安东尼·戴维斯', 2, TO_TIMESTAMP('2023-12-25 10:32:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 3, TO_TIMESTAMP('2023-12-25 10:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 3, TO_TIMESTAMP('2023-12-25 11:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 2, TO_TIMESTAMP('2023-12-25 11:15:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('洛杉矶湖人队', 23, '勒布朗·詹姆斯', 2, TO_TIMESTAMP('2023-12-25 11:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 1, TO_TIMESTAMP('2023-12-25 10:10:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 1, TO_TIMESTAMP('2023-12-25 10:25:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 1, TO_TIMESTAMP('2023-12-25 10:40:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 11, '克莱·汤普森', 2, TO_TIMESTAMP('2023-12-25 10:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 2, TO_TIMESTAMP('2023-12-25 10:55:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 2, TO_TIMESTAMP('2023-12-25 11:10:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 3, TO_TIMESTAMP('2023-12-25 11:25:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 3, TO_TIMESTAMP('2023-12-25 11:40:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_score VALUES ('金州勇士队', 30, '斯蒂芬·库里', 3, TO_TIMESTAMP('2023-12-25 11:55:00', 'YYYY-MM-DD HH24:MI:SS'));
-- 查询数据
SELECT * FROM t_score;
分析:
1.使用LAG开窗函数 筛选出 下一次和下下一次得分,并用进球时间进行排序
2.使用where筛选出值得嘉奖的球员
WITH ScoreRanking AS (
SELECT
team_name,
player_id,
player_name,
score_time,
LAG(player_id, 1) OVER (PARTITION BY team_name ORDER BY score_time) AS prev_player_1,
LAG(player_id, 2) OVER (PARTITION BY team_name ORDER BY score_time) AS prev_player_2
FROM
t_score
)
SELECT DISTINCT
team_name,
player_name
FROM
ScoreRanking
WHERE
player_id = prev_player_1
AND player_id = prev_player_2;