【问题标题】:How can I know the last child of a level according to a path index in a list如何根据列表中的路径索引知道关卡的最后一个孩子
【发布时间】:2021-04-21 15:31:31
【问题描述】:

我有一个嵌套表,其中包含许多级别的父元素和子元素。它返回每个记录的级别和路径索引,如下所示:

如果该行是 path_index 父项的最后一行子项,我如何创建其他字段?我在这里包含了一个来自 sql 的手动示例,使用我当前的查询https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=3963054e14723bd7dae146ab82ae936c

基本上是这样的:在path_index 1.1里面有1.1.1、1.1.2和1.1.3,有1.1.3的行将是父1.1的最后一行,但是在1.1.2里面有1.1.2.1,那么 1.1.2.1 为真,因为它是 1.1.2 的最后一个子节点,那么它作为最后一行父节点接收到真值,完整示例如下:

我该如何为此做一个算法?可以使用 SQL 或 Java/Kotlin 来完成。

【问题讨论】:

    标签: algorithm sqlite kotlin nested-lists


    【解决方案1】:

    您可以使用cte 中的rn 列来检查窗口函数MAX() 是否是每个父级的最后一个子级:

    WITH 
      levels AS (
        SELECT *, 0 lvl FROM items
        UNION ALL
        SELECT i.*, l.lvl + 1 
        FROM items i INNER JOIN levels l
        ON l.id = i.parentId 
      ),
      row_numbers AS (
        SELECT id, item_name, parentId, MAX(lvl) lvl,
               ROW_NUMBER() OVER (PARTITION BY parentId, lvl ORDER BY id) rn
        FROM levels
        GROUP BY id, item_name, parentId
      ),
      cte AS (
        SELECT id, item_name, parentId, lvl, rn, rn || '' path_index
        FROM row_numbers
        UNION ALL
        SELECT r.id, r.item_name, r.parentId, r.lvl, r.rn,
               c.path_index || '.' || r.rn
        FROM row_numbers r INNER JOIN cte c
        ON r.parentId = c.id 
      )
    SELECT id, item_name, parentId, lvl, path_index,
           rn = MAX(rn) OVER (PARTITION BY parentId) lastRowFromParent 
    FROM cte  
    GROUP BY id
    HAVING MAX(LENGTH(path_index))
    ORDER BY path_index + 0, path_index
    

    请参阅demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2021-09-12
      • 2020-06-14
      • 2021-11-12
      • 2015-08-09
      相关资源
      最近更新 更多