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
    );