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

无需APOC过程,使用Cypher查询球队最长连胜次数

计算各球队最长连胜的Cypher解决方案

不用APOC的话,咱们可以借助窗口函数来实现连续连胜的统计,核心思路是把连续的获胜场次归为同一组,计算每组的长度后取最大值就行。

这里是完整的Cypher语句:

MATCH (a:TeamFootbal)-[r]->(m:Games)<-[r2]-(op:TeamFootbal)
WITH a.name AS teamname, 
     CASE WHEN r.scores > r2.scores THEN 1 ELSE 0 END AS result,
     m
ORDER BY teamname, m.date  -- 这里请替换成你实际用来排序比赛顺序的字段,比如m.match_time或者m.round
WITH teamname, 
     result,
     ROW_NUMBER() OVER (PARTITION BY teamname ORDER BY m.date) AS game_num,
     -- 用失利场次当分隔符,给每个连胜序列分配唯一分组ID
     SUM(CASE WHEN result = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY teamname ORDER BY game_num) AS streak_group
-- 只统计获胜场次,计算每个连胜组的长度
WITH teamname,
     result,
     streak_group,
     COUNT(*) OVER (PARTITION BY teamname, streak_group) AS current_streak
WHERE result = 1
-- 提取每个球队的最长连胜
WITH teamname, MAX(current_streak) AS longest_streak
ORDER BY longest_streak DESC, teamname

逻辑拆解:

  • 第一步:先获取每个球队的每场比赛结果,并且按球队+比赛时间排序——这是计算连胜的关键前提,必须保证比赛是按时间先后顺序排列的。
  • 第二步:用ROW_NUMBER()给每个球队的比赛按顺序编号,方便后续窗口函数的分组计算。
  • 第三步:通过SUM(CASE...)窗口函数,每次遇到失利(result=0)就给分组ID加1,这样连续的获胜场次会被归为同一个分组。
  • 第四步:统计每个分组的场次数量(也就是当前连胜的长度),同时过滤掉失利场次(这些场次的连胜长度为0,不影响最长连胜的计算)。
  • 第五步:对每个球队取最大的连胜长度,得到最终结果。

用你提供的示例数据测试的话,输出结果会是:

teamnamelongest_streak
B4
E4
A3
C2
D1

完全符合你想要的“B 4、E 4”这类结果的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:47:44