Postgresql ise我将假设您使用的是当前版本,并进行相应的测试当前行和后面的无界行之间的行(我以前使用的是行编号)。。。因此,您可以删除它。Hi在执行查询时出错(顺便说一句:我使用的是postgre 8.4.1):错误:当前行的帧开始未实现第16行:窗口w为(按id_
Postgresql ise我将假设您使用的是当前版本,并进行相应的测试当前行和后面的无界行之间的行(我以前使用的是行编号)。。。因此,您可以删除它。Hi在执行查询时出错(顺便说一句:我使用的是postgre 8.4.1):错误:当前行的帧开始未实现第16行:窗口w为(按id_,postgresql,hierarchical-data,ancestor,Postgresql,Hierarchical Data,Ancestor,ise我将假设您使用的是当前版本,并进行相应的测试当前行和后面的无界行之间的行(我以前使用的是行编号)。。。因此,您可以删除它。Hi在执行查询时出错(顺便说一句:我使用的是postgre 8.4.1):错误:当前行的帧开始未实现第16行:窗口w为(按id_根行在当前行之间划分…@qstorms好吧,这就是你没有在问题中指定你的版本所得到的结果,我恐怕:如果你不这样说,我将假设你在当前版本上,并进行相应的测试。当前行和无界行之间的行在最终版本的q中实际上没有必要uery(我以前用的是行号)…所以您
ise我将假设您使用的是当前版本,并进行相应的测试<在查询的最终版本中,实际上不需要代码>当前行和后面的无界行之间的行(我以前使用的是
行编号
)。。。因此,您可以删除它。Hi在执行查询时出错(顺便说一句:我使用的是postgre 8.4.1):错误:当前行的帧开始未实现第16行:窗口w为(按id_根行在当前行之间划分…@qstorms好吧,这就是你没有在问题中指定你的版本所得到的结果,我恐怕:如果你不这样说,我将假设你在当前版本上,并进行相应的测试。当前行和无界行之间的行在最终版本的q中实际上没有必要uery(我以前用的是行号
)…所以您可以删除它。@qstorms如果您使用的是一个带绿色记号的解决方案,您通常应该接受它作为最正确答案。@qstorms如果您使用的是一个带绿色记号的解决方案,您通常应该接受它作为最正确答案。
id | id_ancestor | id_entry | bool_flag
---------------------------------------
1 | null | a | false
2 | 1 | a | false
3 | 2 | a | true
4 | 3 | a | false
5 | null | b | true
6 | null | c | false
7 | 6 | c | false
1. 1 <- 2 <- 3 <- 4
2. 5
3. 6 <- 7
1. 4
2. 5
3. 7
1. 3
2. 5
3. <empty result>
WITH RECURSIVE walk(id, id_ancestor, id_entry, bool_flag, id_root, generation) AS (
SELECT id, id_ancestor, id_entry, bool_flag, id, 0
FROM RELATIONSHIP_TABLE
WHERE id_ancestor IS NULL
UNION ALL
SELECT x.id, x.id_ancestor, x.id_entry, x.bool_flag, walk.id_root, walk.generation + 1
FROM RELATIONSHIP_TABLE x INNER JOIN walk ON x.id_ancestor = walk.id
)
SELECT
id_entry, id_root, id
FROM (
SELECT
id, id_entry, bool_flag, id_root, generation,
max(CASE WHEN bool_flag THEN generation END ) OVER w as max_enabled_generation
FROM walk
WINDOW w AS (PARTITION BY id_root ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
) x
WHERE generation = max_enabled_generation;
WITH RECURSIVE walk(id, id_ancestor, id_entry, bool_flag, generation) AS (
SELECT id, id_ancestor, id_entry, bool_flag, 0
FROM RELATIONSHIP_TABLE
WHERE id_ancestor IS NULL
UNION ALL
SELECT x.id, x.id_ancestor, x.id_entry, x.bool_flag, walk.generation + 1
FROM RELATIONSHIP_TABLE x INNER JOIN walk ON x.id_ancestor = walk.id
)
SELECT
id_entry, id
FROM (
SELECT
id, id_entry, bool_flag, generation,
max(CASE WHEN bool_flag THEN generation END ) OVER w as max_enabled_generation
FROM walk
WINDOW w AS (PARTITION BY id_entry ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
) x
WHERE generation = max_enabled_generation;
WITH RECURSIVE tail AS (
SELECT id AS opa
, id, bool_flag FROM boolshit
WHERE bool_flag = True
UNION ALL
SELECT t.opa AS opa
, b.id, b.bool_flag FROM boolshit b
JOIN tail t ON b.id_ancestor = t.id
)
SELECT *
FROM boolshit bs
WHERE bs.bool_flag = True
AND NOT EXISTS (
SELECT * FROM tail t
WHERE t.opa = bs.id
AND t.id <> bs.id
AND t.bool_flag = True
);