我如何根据列表中的路径索引知道级别的最后 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。
我有一个嵌套的 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。