SQL 查询从其他列查找最后的链接数据

问题描述 投票:0回答:1

我需要帮助找到其他列的最后链接数据并获得更高的状态

这是示例数据:

freed198
->
anna1112
->
jimmy908
->
alison287
->
summer7879

因为

summer7879
地位较高,所以我们选择
summer7879

gundre333
->
joy657
->
yero554
->
susi889

在连锁中

susi889
不是更高的地位,我们选择
yero554

低于预期结果:

状态:

  • 活跃 = 2
  • 半活跃 = 1
  • 不活动 = 0

希望查询能得到优化,因为数据太大了。

谢谢。

sql mariadb
1个回答
0
投票

您的数据中有拼写错误,并且没有提供表名称或指示如何对结果进行排序,并且 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
© www.soinside.com 2019 - 2024. All rights reserved.