使用MySQL确定连续条纹

时间:2018-10-11 18:19:15

标签: mysql

例如:

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个游戏就使它变得简单。

1 个答案:

答案 0 :(得分:0)

  • 可以使用使用Session Variables的方法。它将适用于所有GAME_IDGOALIEID组合。
  • 为了正确使用Session变量,我们首先需要对数据集进行排序。因此,在Derived Table中,我们通过GAME_IDGOALIEIDOVERALLSHOT在多个级别对数据进行排序;因为在特定游戏中为守门员定义了唯一的连胜。
  • 现在,我们使用此有序数据集来确定条纹。我们将If()函数用于条件逻辑。这里的逻辑是,如果遇到目标(SCORED = 'Y',我们会将条纹编号设置为 0 (因为它已被破坏);否则(已保存目标),如果先前的GAME_IDGOALIEID与当前相同,我们增加我们的连胜号码;否则,将连胜号码设置为 1
  • 现在,我们再次简单地将此数据集用作派生表,并在Group ByGAME_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

Rextester DEMO

输出:

Rextester Demo Output