Sql 基于两列的比较获取尽可能长的行集

Sql 基于两列的比较获取尽可能长的行集,sql,Sql,我有一个表,其中有如下字段: num_索引 数值 上一个数值 1. abcde1234 0 1. qwe342asd 0 2. fghij5678 abcde1234 2. t5344dsad qwe342asd 2. y54675adz qwe342asd 3. klmno5432 fghij5678 3. 约特9971 t5344dsad 4. pqrst3232 klmno5432 5. xyzab6t05 pqrst3232 您可以使用递归CTE创建路径: with recursive

我有一个表,其中有如下字段:

num_索引 数值 上一个数值 1. abcde1234 0 1. qwe342asd 0 2. fghij5678 abcde1234 2. t5344dsad qwe342asd 2. y54675adz qwe342asd 3. klmno5432 fghij5678 3. 约特9971 t5344dsad 4. pqrst3232 klmno5432 5. xyzab6t05 pqrst3232
您可以使用递归CTE创建路径:

with recursive cte as (
      select num_index, num_val, previous_num_val, cast(num_val as char(10000)) as num_vals, 1 as n
      from t
      where num_index = 5
      union all
      select t.num_index, t.num_val, t.previous_num_val, concat_ws('->', cte.num_vals, t.num_val), n + 1
      from cte join
           t
           on t.num_index = cte.num_index - 1 and
              t.num_val = cte.previous_num_val
     )
select *
from (select cte.*, max(n) over () as max_n
      from cte
     ) cte
where n = max_n
请注意,这会将值放在串联字符串中,而不是放在单独的行中


是一个dbfiddle(它恰好使用MySQL,但在SQLite中的代码非常类似)。

我删除了不兼容的数据库标记。请仅使用您真正使用的数据库进行标记。你是不是要进来?这是如何确定的?我正在使用sqlite3,它将是“num_index”列的一个值,条件是带有“num_index”3的行的“previous_num_val”应该等于带有“num_index”2的行的“num_val”,以此类推,对于响应,从5到1只有一个路径遵循列“n”的num的条件等于列“n+1”的前一个数值,例如,您给我的小提琴的结果之一是:xyzab6t05->pqrst3232->YORT9971->t5344dsad->abcde1234,但值“YORT9971”已经打破了条件,因为列“klmno5432”的前一个数值是“fghij5678”和(“fghij5678”!=“YORT9971”)对不起,我的回答太长了,但我想让自己明白clear@Sassy . . . 我明白了。调整后的答案只返回一行。再次感谢您的回答,它现在可以工作了,唯一剩下的问题是我看到限制字符串长度为10k字符,我需要将此查询缩放为许多行,是否有办法以表格格式获得结果?因为如果我的路径大于1k行,我认为num_vals将中断(>10k个字符)。再次,非常感谢你的邀请answer@Sassy . . . 在某个时候,递归CTE会出现问题。但你可以随心所欲地限制。我只是输入了一个简单的数字。