【问题标题】:Select keys connected by its values选择按其值连接的键
【发布时间】:2020-12-01 19:53:49
【问题描述】:

我有两列,比如键和值。 我需要关于值之间连接的组键,如图所示。相同的值连接键。 我不知道该怎么做。使用 10.5.8-MariaDB。

【问题讨论】:

    标签: sql mariadb graph-theory graph-algorithm recursive-query


    【解决方案1】:

    这是一个典型的图遍历问题 - 需要递归查询,从 MariaDB 10.2.2 开始可用。

    这是一种方法,首先将边构建为连接节点的元组,然后迭代地遍历数据集,跟踪已经访问过的节点。我们可以通过跟踪最小访问节点来识别每个节点属于哪个组。

    with recursive 
        edges as (
            select t1.lagr_number as lagr_number1, t2.lagr_number as lagr_number2
            from mytable t1
            inner join mytable t2 on t2.ltran_number = t1.ltran_number
        ),
        cte as (
            select lagr_number1, lagr_number2, concat(lagr_number1, ',', lagr_number2) as visited
            from edges
            union all
            select c.lagr_number1, e.lagr_number2, concat(c.visited, ',', e.lagr_number2)
            from cte c
            inner join edges e on e.lagr_number1 = c.lagr_number2
            where not find_in_set(e.lagr_number2, c.visited)
        )
    select lagr_number1 as lagr_number, dense_rank() over(order by min(lagr_number2)) as grp
    from cte
    group by lagr_number1
    order by grp, lagr_number1
    

    Demo on DB Fiddle

    样本数据:

    lagr_number | ltran_number :------------ | :----------- K000001 | V000001 K000001 | V000004 K000001 | V000005 K000002 | V000001 K000003 | V000002 K000003 | V000003 K000004 | V000005 K000005 | V000007 K000005 | V000008 K000006 | V000009 K000007 | V000009

    结果:

    lagr_number | grp :------------ | --: K000001 | 1 K000002 | 1 K000004 | 1 K000003 | 2 K000005 | 3 K000006 | 4 K000007 | 4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2015-09-21
      • 2011-01-08
      • 2011-02-08
      相关资源
      最近更新 更多