【问题标题】:MySQL multi-column maxium sequential runsMySQL多列最大顺序运行
【发布时间】:2026-01-21 11:05:02
【问题描述】:

几天来,我一直在努力尝试为以下问题编写查询(MySQL 的新手)。

我有一个表 A,其中包含以下数据

id, r1, r2, r3, r4, r5, r6, r7, r8, r9, max
 1,  1,  2,  3,  6,  7,  8,  9,  0
 2,  1,  3,  4,  5,  6,  7,  8,  0
 3,  2,  4,  5,  7,  9, 11, 12,  0

我需要将 max 字段设置为行中的最大序列。例如,第 1 行的最大序列为 4 (6,7,8,9),因此最大字段将显示 4。行中的数字始终从小到大(从左到右)列出。

我怀疑这会是类似的东西;

SET @r:=0
SET @s:=0

IF(r1 + 1 = r2, IF(@r > @s, @s:=@r, @r:= @r + 1),
IF(r2 + 1 = r3, IF(@r > @s, @s:=@r, @r:= @r + 1),
IF(r3 + 1 = r4, IF(@r > @s, @s:=@r, @r:= @r + 1),
IF(r4 + 1 = r5, IF(@r > @s, @s:=@r, @r:= @r + 1),`

等等...但它似乎不起作用,因为增量仅适用于每行??

FOR i <= count(column)
IF count > sequence 
THEN sequence = count
ELSE count ++
NEXT i

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 不清楚你所说的最大序列到底是什么意思。它是最大连续运行吗?第二排,应该是什么,6?第三行应该是 3?
  • 所以在一行中你有 1,2,3,5,6,7,8,9 - 从这里你可以看到你有两个完整的序列(1 到 3)和(5 到9),但我想得到的是最长的不间断序列,在这种情况下,(5 到 9)= 5(包括 5)。我想您可以将其视为序列的最大计数?如果这有意义吗?

标签: mysql multiple-columns sequential


【解决方案1】:

您可能完全可以在 MySQL 中执行此操作,但我认为这会相当混乱。

如果我是你,我会在客户端上执行此操作。这应该可以作为 Perl 实现:

use DBI;
my $dbh = DBI->connect("dbi:mysql", "user", "password");
my $sth = $dbh->prepare("SELECT * FROM mytable");
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
    my $id = $row->{id};
    my @r;
    push @r, $row->{r1}, $row->{r2}, $row->{r3},
             $row->{r4}, $row->{r5}, $row->{r6},
             $row->{r7}, $row->{r8}, $row->{r9};
    my $max = 1; # max run
    my $t = 1;   # local max run
    for (my $i = 1; $i < 9; $i++) {
        if ($r[$i] == $r[$i-1]+1) {
            $t++;
        } else {
            $t = 1;
        }
        if ($t > $max) {
            $max = $t;
        }
    }
    $dbh->do(qq{ UPDATE mytable SET max = ? WHERE id = ?}, undef,
                                   $max,         $id);
}
$sth->finish();
$dbh->disconnect();

【讨论】:

  • 谢谢,不幸的是我没有任何 perl 经验。该查询将只执行一次,并将结果存储在表中。我可以在 excel 中做到这一点,但我有数百万行并且 excel 崩溃(内存故障)。
  • 好吧,这个脚本可以很容易地转换为几乎任何其他脚本语言——python、ruby 等。至少,逻辑应该非常清晰——它都在 for r 数组的循环中.而且,您应该能够按原样运行这个 Perl 脚本 - 只需提供您的连接参数
  • 我一直在网上寻找答案,发现大多数顺序/运行计算通常是在列中的值上执行的,这里的不同之处在于,值存储在一个列中的多个列中行。
  • 谢谢你,我会试一试,让你知道。干杯
  • 只是想找到一种方法让脚本正常工作。目前它因“执行失败:Mysql 客户端内存不足”而崩溃。我怀疑是因为表相当大(200MB +)并且脚本正在将所有结果加载到内存中。我正在尝试找到一种方法来限制处理量(即 1000 行循环)
最近更新 更多