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 pqrst3232Sql 基于两列的比较获取尽可能长的行集,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
您可以使用递归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会出现问题。但你可以随心所欲地限制。我只是输入了一个简单的数字。