无需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,不影响最长连胜的计算)。
- 第五步:对每个球队取最大的连胜长度,得到最终结果。
用你提供的示例数据测试的话,输出结果会是:
| teamname | longest_streak |
|---|---|
| B | 4 |
| E | 4 |
| A | 3 |
| C | 2 |
| D | 1 |
完全符合你想要的“B 4、E 4”这类结果的需求。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

