Mysql 差距和孤岛问题?

标签 mysql sql gaps-and-islands

想要计算总得分高于 60 的事件之间的行数,以及未发生此事件的行数。 例如,第 5 和第 6 场比赛结束时会超过 60,因此将计算 5 行不为 60 和 2 行为 60。

我想要这样的东西:

type                 count
no-60-gap            5
yes-60-island        1
no-60-gap            3
yes-60-island        2

我有一个简单的篮球比赛数据库。下面的粗略示例

id, home,    score_home,  away,     score_away, round
1,  team_1,  33,          team_2,   23,         1 
2,  team_4,  31,          team_1,   33,         1 
3,  team_2,  36,          team_5,   53,         2 
4,  team_5,  35,          team_1,   63,         2 
5,  team_7,  31,          team_8,   53,         3 
6,  team_2,  30,          team_1,   43,         3 
7,  team_1,  39,          team_3,   13,         4 

通过 google 解决了这个问题,我最终试图用间隙和孤岛来解决我的问题。

这是我的解决方案,但它不起作用。想法只是在没有发生时将间隙/岛重置为 0。 我是这方面的新手。

SET @gap :=0; SET @island :=0;
SELECT 
@gap, 
@island
FROM (
SELECT 
CASE 
    WHEN (score_home + score_away) >= 60 THEN @island:=@island+1 
    WHEN (score_home + score_away) >= 60 THEN @gap:=0 
END,
CASE 
    WHEN (score_home + score_away) < 60 THEN @island:=0 
    WHEN (score_home + score_away) < 60 THEN @gap:=@gap+1
END
FROM basket

) AS games

感谢任何帮助

最佳答案

我想你正在寻找这样的东西......

SELECT v,flag,COUNT(*)
  FROM 
     ( SELECT flag
            , CASE WHEN @prev = flag THEN @v:=@v ELSE @v:=@v+1 END v
            , @prev:=flag
         FROM 
            ( SELECT *, score_home + score_away >= 60 flag FROM my_table ) x
         JOIN
            ( SELECT @prev:=NULL,@v:=0) vars
        ORDER
           BY id
     ) n
 GROUP
    BY v,flag;

关于Mysql 差距和孤岛问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34558184/

相关文章:

mysql - 按日历史库存

mysql - 使用MySQL变量通过评分创建分组

mysql - 使用连接表进行分组并计算总和

sql - 使用自连接在 row_to_json() 中复制 JSON 元素

sql - 在 PostgreSQL 中通过值转换选择最小值

python - 给定唯一 ID,仅选择与之前的行相比列发生更改的行

php - 试图获取非对象 CodeIgniter 框架的属性

mysql - 如何检查数据库中的记录数是否超过 x 次

SQL 条件字符串在Where 子句中进行比较

mysql - mysql 范围内缺少缺失值