【问题标题】:Count consecutive rows in mySQL 5.6在 mySQL 5.6 中计算连续行
【发布时间】:2020-06-18 05:58:06
【问题描述】:

我正在尝试计算逐行计算连续值。 我有一个 mySQL / php 网站。

根据赛车联赛成绩表,我有这样的示例数据:

(比赛编号、赛季编号、赛道编号、第一个 (p1)、第二个 (p2).... 最后一个 (p2) 填充有飞行员 ID)。

id, season, track, p1,  p2....  p20
1,  1,      1,      1,  4, .... 15
2,  1,      2,      3,  5, .... 15
3,  1,      3,      1,  4, .... 15
4,  1,      4,      1,  2, .... 15
5,  1,      5,      1,  4, .... 15
6,  1,      6,      2,  2, .... 15
7,  1,      7,      2,  4, .... 15
8,  1,      8,      1,  2, .... 15

如您所见,pilotID n.1 从第 3 场到第 5 场连续赢了 3 次,而从第 6 场到第 7 场,pilotID n.2 连续赢了 2 次。

我的目标输出表是:

count,  pilot,  fromRaceID,     toRaceID
3,      1,      3,              5
2,      2,      6,              7

按数量排序。

我知道这很复杂,甚至不可能;我在尝试这样做时发现了很大的困难,因此非常感谢您的帮助。

【问题讨论】:

  • 你的mysql版本是什么。
  • MySQL版本为5.6

标签: mysql sql subquery


【解决方案1】:

这是一种差距和岛屿。减去一个序列号,“相邻”值将保持不变:

select p1, min(trackid), max(trackid), count(*)
from (select t.*,
             row_number() over (partition by p1 order by track_number) as seqnum
      from t
     ) t
group by p1, (track_number - seqnum)
having count(*) > 1;

编辑:

在旧版本的 MySQL 中,您可以使用:

select p1, min(trackid), max(trackid), count(*)
from (select t.*,
             (select count(*)
              from t t2
              where t2.p1 = t.p1 and t2.track_number <= t.track_number
             ) as seqnum
      from t
     ) t
group by p1, (track_number - seqnum)
having count(*) > 1;

【讨论】:

  • 感谢您的大力帮助。无论如何,我遇到了一个语法错误,mySQL 在“Partition by”附近说。
  • 戈登,你不认为 OP 需要输出中的所有 P1-P20,而不仅仅是 P1。我想你必须重新考虑你的答案。
  • @AnkitBajpai 。 . .据我了解这个问题,OP 只关心p1 中的获胜者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多