You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算PieCloudDB中球员最长连胜?SQL查询问题求助

问题:计算PieCloudDB中球员最长连胜时的空值处理问题

表结构与数据

Matches表记录比赛结果,结构和数据如下:

player_idmatch_dayresults
12023-10-17Win
12023-10-18Win
12023-10-20Draw
12023-10-23Win
12023-10-25Win
12023-10-31Win
22023-10-20Draw
22023-10-22Lose
22023-10-27Win
32023-11-01Lose

需求与预期输出

需要计算每位球员的最长连胜(连胜不能被平局或输球中断),预期输出:

player_idlongest_streak
13
21
30

原SQL与问题

使用以下SQL查询时,球员3的longest_streak字段为空值,不符合预期:

select t1.player_id, max(t2.streak) as longest_streak 
from (select distinct player_id from Matches) t1
left join (
    select player_id, count(*) as streak
    from (
        select *, rank()over(partition by player_id order by match_day) as rk1,
        rank()over(partition by player_id, results order by match_day) as rk2
        from Matches) a
    where results = 'Win'
    group by player_id, rk1-rk2) t2
on t1.player_id = t2.player_id
group by 1
order by player_id;

问题原因

球员3没有任何获胜记录,子查询t2中不存在该球员的数据。LEFT JOIN后t2.streak对应的值为NULL,而MAX(NULL)的结果仍为NULL,无法得到预期的0。

修正方案

使用COALESCE函数将MAX(t2.streak)的空值转换为0,修改后的SQL如下:

select t1.player_id, COALESCE(max(t2.streak), 0) as longest_streak 
from (select distinct player_id from Matches) t1
left join (
    select player_id, count(*) as streak
    from (
        select *, rank()over(partition by player_id order by match_day) as rk1,
        rank()over(partition by player_id, results order by match_day) as rk2
        from Matches) a
    where results = 'Win'
    group by player_id, rk1-rk2) t2
on t1.player_id = t2.player_id
group by 1
order by player_id;

说明

COALESCE函数会返回传入参数中的第一个非空值,当max(t2.streak)为NULL时,就会返回0,正好满足没有获胜记录的球员最长连胜为0的需求。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:22:04