【问题标题】:Postgres recursive queries and window functions to produce tree from tablePostgres 递归查询和窗口函数从表中生成树
【发布时间】:2021-06-06 16:44:21
【问题描述】:

假设我有以下数据。

CREATE TABLE ORDERS(
  id INT PRIMARY KEY,
  category TEXT,
  subcategory TEXT,
  description TEXT
);

INSERT INTO TABLE ORDERS VALUES
(1001, "CAT1"   "SUBCAT1"   "DESC1"),
(1002, "CAT1"   "SUBCAT1"   "DESC2"),
(1003, "CAT1"   "SUBCAT2"   "DESC3"),
(1004, "CAT1"   "SUBCAT2"   "DESC4"),
(1005, "CAT1"   "SUBCAT2"   "DESC5"),
(1006, "CAT2"   "SUBCAT3"   "DESC6"),
(1007, "CAT2"   "SUBCAT3"   "DESC7"),
(1008, "CAT2"   "SUBCAT4"   "DESC8"),

我收到了生成一个包含单列的表的请求,其中类别和子类别的排列方式如下所示。

result
-------------
CAT1
  -> SUBCAT1
    -> DESC1
    -> DESC2
    -> DESC3
  -> SUBCAT2
    -> DESC4
    -> DESC5
CAT2
  -> SUBCAT3
    -> DESC6
    -> DESC7
  -> SUBCAT4
    -> DESC8

我不明白如何按照我的客户(尤其是第一个)建立的要求完成任务。它们是:

  • 我应该使用两个新列:
    • parent:引用父级类别。
    • seq_orders: 构建序列
  • 我应该使用窗口函数和递归查询来构建树状列

我希望从外面看到这个的人可以提供一些帮助。

谢谢!


编辑

有必要(以某种方式)按照客户的要求遵循此流程:

  1. 创建列parent 以引用更高级别的类别。更高级别的类别会将此字段设为空。
  2. 创建一个名为 seq_orders 的序列,该序列从 1 开始并增加一个单位。
  3. 使用上述顺序将级别1(类别字段)和级别2(子类别字段)的不同级别插入到表中以分配不同的ids。在级别 2 和级别 3 中,parent 字段必须指向相应的更高级别的类别。
  4. 删除冗余字段类别和子类别。

【问题讨论】:

    标签: sql postgresql recursion


    【解决方案1】:

    您实际上并不想要递归 CTE。您想要取消透视数据并为每个级别添加行。这看起来像:

    select x.which
    from ((select '    -> ' || o.description as which, array[o.category, o.subcategory, o.description] as ord
           from orders o
           group by o.category, o.subcategory, o.description
          ) union all
          (select '  -> ' || o.subcategory, array[o.category, o.subcategory]
           from orders o
           group by o.category, o.subcategory
          ) union all
          (select o.category, array[o.category]
           from orders o
           group by o.category
          )
         ) x
    order by ord;
    

    Here 是递归 CTE。

    【讨论】:

    • 非常感谢您的回答。它给出了预期的结果。但是,我必须满足客户的上述要求。如上所述:1)创建parent列来存储指向类别、子类别和描述的引用; 2)使用另一列作为序列来枚举项目。还有两个我错过了。我会将它们添加到问题中。
    • @CarlosDavila 。 . .这回答了您提出的问题。如果您有其他问题,我建议您将其作为问题提出。
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多