我如何根据列表中的路径索引知道级别的最后 child

How can I know the last child of a level according to a path index in a list

我有一个嵌套的 table,其中包含许多级别的 parent 和 child 元素。它returns我每条记录的层级和路径索引如下:

如果该行是 path_index parent 的最后一行 child,我如何制作其他字段?我在此处包含了来自 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的那一行就是parent 1.1的最后一行,但是在 1.1.2 里面有 1.1.2.1,那么 1.1.2.1 是真的,因为它是 1.1.2 的最后一个 child,然后它接收到最后一行 parent 是真的,一个完整的例子如下:

我如何为此做一个算法?可以使用 SQL 或 Java/Kotlin.

来完成

您可以使用 cte 中的列 rn 通过 window 函数 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