如何对比行与前一行检测胜负切换?基于points表的SQL实现
统计单场比赛每局的胜负切换次数
现有SQL表points,结构如下:
CREATE TABLE "points" ( "match_id" INTEGER, "player_id" INTEGER, "opponent_id" INTEGER, "set" INTEGER, "point" INTEGER, "won" INTEGER );
我们需要针对单个玩家,对比其每一分的won值与前一分的won值,统计每场比赛每局的胜负切换次数n_switches。
举个例子:当某局的won数组为[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]时,胜负切换次数为3。
给出的部分查询语句存在一处错误(prev_player_id应为prev.player_id),我们可以在此基础上完善查询,最终按match_id和set分组得到如下预期输出:
| match_id | set | n_switches |
|---|---|---|
| 37346937 | 1 | 12 |
| 37346937 | 2 | 4 |
| 37346937 | 3 | 8 |
完善后的SQL查询
-- 替换目标玩家ID为你要分析的player_id值,比如123 SELECT cur.match_id, cur.set, SUM(CASE WHEN cur.won != prev.won THEN 1 ELSE 0 END) AS n_switches FROM points cur LEFT JOIN points prev ON cur.match_id = prev.match_id AND cur.player_id = prev.player_id AND cur.set = prev.set AND cur.point = prev.point + 1 WHERE cur.player_id = 目标玩家ID -- 这里指定单个玩家 GROUP BY cur.match_id, cur.set;
关键说明
- 修正原JOIN条件的错误:将
prev_player_id改为prev.player_id,确保关联同一场比赛、同一玩家、同一局的前一分数据。 - 用
CASE WHEN判断当前分与前一分的胜负是否切换,每切换一次计1分。 - 通过
SUM()累加每局的切换次数,最终按match_id和set分组输出结果。 WHERE子句指定要分析的单个玩家,替换成实际玩家ID即可。
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

