我需要帮助找到其他列的最后链接数据并获得更高的状态
这是示例数据:
freed198
-> anna1112
-> jimmy908
-> alison287
-> summer7879
因为
summer7879
地位较高,所以我们选择summer7879
gundre333
-> joy657
-> yero554
-> susi889
在连锁中
susi889
不是更高的地位,我们选择yero554
低于预期结果:
状态:
希望查询能得到优化,因为数据太大了。
谢谢。
您的数据中有拼写错误,并且没有提供表名称或指示如何对结果进行排序,并且 ColumnA='yero554' 和 ColumnA='dondon986' 的预期结果没有意义。但这是我会采取的一般方法,使用递归 cte 遍历每个链,跟踪迄今为止找到的最佳状态(及其 ColumnB),然后选择具有最大深度的行:
with recursive foo_chain as (
select
id,
ColumnA,
ColumnB,
Status,
1 depth,
ColumnB last_chain,
find_in_set(Status,'inactive,half active,active') best_status,
ColumnB best_chain
from foo
union all
select
foo_chain.id,
foo_chain.ColumnA,
foo_chain.ColumnB,
foo_chain.Status,
depth+1,
foo.ColumnB,
# best status found so far
greatest(foo_chain.best_status, find_in_set(foo.Status,'inactive,half active,active')),
# save this foo as best if status at least as good as we've found so far
case when find_in_set(foo.Status,'inactive,half active,active') >= foo_chain.best_status
then foo.ColumnB
else foo_chain.best_chain
end
from foo_chain join foo on foo.ColumnA=foo_chain.last_chain
)
select ColumnA, ColumnB, Status, best_chain Result
from (
select *, row_number() over (partition by ColumnA, ColumnB, Status order by depth desc) preference
from foo_chain
) f
where preference=1
order by id