例如:
GAME_ID GOALIEID TEAMID TEAMSHOTNUM OVERALLSHOT SCORED
2001 57 11 1 1 Y
2001 41 22 1 2 N
2001 57 11 2 3 N
2001 41 22 2 4 N
2001 57 11 3 5 N
2001 41 22 3 6 Y
2001 57 11 4 7 N
2001 41 22 4 8 Y
基于这个简单的示例:我如何查询最连续的“保存”,即“ GoalieID”为“ N”,现在想象我的数据需要查看多个游戏,但为简单起见,我只有一个游戏在这里。
我希望我的结果看起来像这样:
GAME_ID GOALIEID STREAK
2001 57 3
这将表明“ GOALIEID”#57在枪战中连续3次保存,表明最高的连续保存实际上是3次。请注意,这将涉及数千个游戏。但是我只用1个游戏就使它变得简单。
答案 0 :(得分:0)
GAME_ID
和GOALIEID
组合。GAME_ID
,GOALIEID
和OVERALLSHOT
在多个级别对数据进行排序;因为在特定游戏中为守门员定义了唯一的连胜。If()
函数用于条件逻辑。这里的逻辑是,如果遇到目标(SCORED = 'Y'
,我们会将条纹编号设置为 0 (因为它已被破坏);否则(已保存目标),如果先前的GAME_ID
和GOALIEID
与当前相同,我们增加我们的连胜号码;否则,将连胜号码设置为 1 Group By
和GAME_ID
上分别使用GOALIEID
,并使用Max()
函数来确定特定的游戏和守门员。您也可以参考此tutorial来说明如何使用会话变量来计算行号。
尝试以下代码以获得最大条纹:
SELECT
dt.GAME_ID,
dt.GOALIEID,
MAX(dt.STREAK) AS STREAK
FROM
(
SELECT
@streak := IF(t1.SCORED = 'Y',
0,
IF(@gameid = t1.GAME_ID AND
@goalieid = t1.GOALIEID,
@streak + 1,
1)
) AS STREAK,
@gameid := t1.GAME_ID AS GAME_ID,
@goalieid := t1.GOALIEID AS GOALIEID
FROM
(
SELECT
GAME_ID,
GOALIEID,
SCORED
FROM your_table
ORDER BY GAME_ID, GOALIEID, OVERALLSHOT ) AS t1
CROSS JOIN (SELECT @gameid := 0,
@goalieid := 0,
@streak := 0) AS init_params
) AS dt
GROUP BY dt.GAME_ID, dt.GOALIEID
输出: