嘿,我在Snowflake有一个公司表,定义如下.我已经添加了源表数据和所需目标视图数据的屏幕截图.我还添加了我为该视图编写的代码,但它不能以正确的方式生成结果.

该表名为Companies,视图名为CompanyHierarchyView.我们希望达到的级别是7级.在输出结果中,我只添加了直到级别3以供参考.

由于团队中编码知识的限制,我还需要使用SQL而不是其他语言(如Python或Java)来完成此任务

CREATE OR REPLACE TABLE COMPANIES 

(PARENTCOMPANY VARCHAR(1000),
PARENTID int,
CHILDCOMPANY VARCHAR(1000),
CHILDID int
);

The data in the table is as below:
   Parent Company   Parent ID   Child Company   Child ID
Meta Platforms, Inc.    1   Atlas Solutions, Inc.   2
Meta Platforms, Inc.    1   Acrylic Software    5
Meta Platforms, Inc.    1   American Journalism Project 6
Meta Platforms, Inc.    1   Caffeinated Mind, Inc.  7
Meta Platforms, Inc.    1   Confirm Inc.    8
Meta Platforms, Inc.    1   Digital Staircase Inc.  9
Meta Platforms, Inc.    1   Facebook Technologies, LLC  4
Atlas Solutions, Inc.   2   Accipiter Solutions, LLC    3
Atlas Solutions, Inc.   2   Atlas NetConventions, Inc.  10
Atlas Solutions, Inc.   2   Go Toast, LLC   11
Atlas Solutions, Inc.   2   Ad4ever Inc.    12
Atlas Solutions, Inc.   2   Atleas Search   13
Accipiter Solutions, LLC    3   BidClix, Inc.   14
Facebook Technologies, LLC  4   Jenkins Software LLC    15
Facebook Technologies, LLC  4   Nimble VR   16
Facebook Technologies, LLC  4   13th Lab AB 17
Facebook Technologies, LLC  4   Armature Studios LLC    18
Facebook Technologies, LLC  4   Beat Games s.r.o    19
Facebook Technologies, LLC  4   BigBox VR, Inc. 20
Facebook Technologies, LLC  4   Camouflaj LLC   21
Facebook Technologies, LLC  4   Carbon Design Group, Inc.   22
Facebook Technologies, LLC  4   Downpour Interactive, LLC   23
Facebook Technologies, LLC  4   ImagineOptix Corporation    24
Facebook Technologies, LLC  4   InfiniLED Limited   25


And I would like to create a view which produces results like this:

  Parent Company    Child Company1  Child Company2  Child Company3
Meta Platforms, Inc.    Acrylic Software        
Meta Platforms, Inc.    American Journalism Project     
Meta Platforms, Inc.    Caffeinated Mind, Inc.      
Meta Platforms, Inc.    Confirm Inc.        
Meta Platforms, Inc.    Digital Staircase Inc.      
Meta Platforms, Inc.    Facebook Technologies, LLC  Jenkins Software LLC    
Meta Platforms, Inc.    Facebook Technologies, LLC  Nimble VR   
Meta Platforms, Inc.    Facebook Technologies, LLC  13th Lab AB 
Meta Platforms, Inc.    Facebook Technologies, LLC  Armature Studios LLC    
Meta Platforms, Inc.    Facebook Technologies, LLC  Beat Games s.r.o    
Meta Platforms, Inc.    Facebook Technologies, LLC  BigBox VR, Inc. 
Meta Platforms, Inc.    Facebook Technologies, LLC  Camouflaj LLC   
Meta Platforms, Inc.    Facebook Technologies, LLC  Carbon Design Group, Inc.   
Meta Platforms, Inc.    Facebook Technologies, LLC  Downpour Interactive, LLC   
Meta Platforms, Inc.    Facebook Technologies, LLC  ImagineOptix Corporation    
Meta Platforms, Inc.    Facebook Technologies, LLC  InfiniLED Limited   
Meta Platforms, Inc.    Atlas Solutions, Inc.   Accipiter Solutions, LLC    BidClix, Inc.
Meta Platforms, Inc.    Atlas Solutions, Inc.   Atlas NetConventions, Inc.  
Meta Platforms, Inc.    Atlas Solutions, Inc.   Go Toast, LLC   
Meta Platforms, Inc.    Atlas Solutions, Inc.   Ad4ever Inc.    
Meta Platforms, Inc.    Atlas Solutions, Inc.   Atleas Search   

I have below code written but it is not producing right results. Can someone help:

CREATE OR REPLACE VIEW CompanyHierarchyView AS
WITH RECURSIVE CompanyHierarchy AS (
  SELECT
    PARENTCOMPANY AS ParentCompany,
    PARENTID,
    CHILDCOMPANY AS ChildCompany,
    CHILDID,
    ROW_NUMBER() OVER (PARTITION BY PARENTCOMPANY, PARENTID ORDER BY CHILDID) AS ChildNum
  FROM COMPANIES -- Replace with your table name
  
  UNION ALL
  
  SELECT
    t.PARENTCOMPANY AS ParentCompany,
    t.PARENTID,
    t.CHILDCOMPANY AS ChildCompany,
    t.CHILDID,
    c.ChildNum
  FROM COMPANIES t
  INNER JOIN CompanyHierarchy c ON t.PARENTID = c.CHILDID
)
SELECT
  ParentCompany,
  MAX(CASE WHEN ChildNum = 1 THEN ChildCompany ELSE NULL END) AS "Child Company1",
  MAX(CASE WHEN ChildNum = 2 THEN ChildCompany ELSE NULL END) AS "Child Company2",
  MAX(CASE WHEN ChildNum = 3 THEN ChildCompany ELSE NULL END) AS "Child Company3",
  MAX(CASE WHEN ChildNum = 4 THEN ChildCompany ELSE NULL END) AS "Child Company4",
  MAX(CASE WHEN ChildNum = 5 THEN ChildCompany ELSE NULL END) AS "Child Company5",
  MAX(CASE WHEN ChildNum = 6 THEN ChildCompany ELSE NULL END) AS "Child Company6",
  MAX(CASE WHEN ChildNum = 7 THEN ChildCompany ELSE NULL END) AS "Child Company7"
FROM CompanyHierarchy
GROUP BY ParentCompany, PARENTID
ORDER BY 1, 2, 7;

会很感激这里的任何帮助.

推荐答案

此视图将父子表的格式重新设置为级别表.该视图添加了一个新行,其中顶级公司是Null的子级.如果您的数据中存在此行,则不需要此行.还要注意,该视图使用·来分隔连接的级别,但可以使用公司名称中没有出现的任何字符.

CREATE OR REPLACE VIEW COMPANYHIERARCHYVIEW AS
WITH COMPANYPC AS (
    SELECT
        PARENTCOMPANY,
        PARENTID,
        CHILDCOMPANY,
        CHILDID
    FROM COMPANIES
    UNION ALL
    SELECT
        NULL,
        NULL,
        'Meta Platforms, Inc.',
        1
)
, CREATE_LEVELS AS
(
    SELECT
        CHILDID,
        CHILDCOMPANY,
        CHILDCOMPANY LEVEL_NAME
    FROM COMPANYPC
    WHERE PARENTID IS NULL
    UNION ALL
    SELECT
        COMPANYPC.CHILDID,
        COMPANYPC.CHILDCOMPANY,
        CONCAT( IFNULL(CREATE_LEVELS.LEVEL_NAME || '•','') , COMPANYPC.CHILDCOMPANY)
    FROM COMPANYPC JOIN CREATE_LEVELS
    ON COMPANYPC.PARENTID = CREATE_LEVELS.CHILDID
)
SELECT
    SPLIT_PART(LEVEL_NAME, '•', 1) PARENTCOMPANY,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 2),'') CHILDCOMPANY1,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 3),'') CHILDCOMPANY2,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 4),'') CHILDCOMPANY3,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 5),'') CHILDCOMPANY4,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 6),'') CHILDCOMPANY5,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 7),'') CHILDCOMPANY6,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 8),'') CHILDCOMPANY7
FROM CREATE_LEVELS;

如果表中存在父项为空的顶级行,则该视图如下所示:

CREATE OR REPLACE VIEW COMPANYHIERARCHYVIEW AS
WITH CREATE_LEVELS AS
(
    SELECT
        CHILDID,
        CHILDCOMPANY,
        CHILDCOMPANY LEVEL_NAME
    FROM COMPANIES
    WHERE PARENTID IS NULL
    UNION ALL
    SELECT
        COMPANIES.CHILDID,
        COMPANIES.CHILDCOMPANY,
        CONCAT( IFNULL(CREATE_LEVELS.LEVEL_NAME || '•','') , COMPANIES.CHILDCOMPANY)
    FROM COMPANIES JOIN CREATE_LEVELS
    ON COMPANIES.PARENTID = CREATE_LEVELS.CHILDID
)
SELECT
    SPLIT_PART(LEVEL_NAME, '•', 1) PARENTCOMPANY,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 2),'') CHILDCOMPANY1,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 3),'') CHILDCOMPANY2,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 4),'') CHILDCOMPANY3,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 5),'') CHILDCOMPANY4,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 6),'') CHILDCOMPANY5,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 7),'') CHILDCOMPANY6,
    NULLIF(SPLIT_PART(LEVEL_NAME, '•', 8),'') CHILDCOMPANY7
FROM CREATE_LEVELS;

Results

Sql相关问答推荐

在SQL Server中使用LEFT连接包含特定记录

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

Postgres:对包含数字的字符串列表进行排序

删除事务中的本地临时表

UPDATE查询中的乐观锁

将计算列设置为持久化的目的是什么?

将日期时间转换为日期格式

在SQL GROUP BY中的某些行之后执行计算

来自按PostgreSQL分组的最小日期

使用特定的Order By子句随机化SQL输出

JSON_VALUE 不适用于提取的 json 中的嵌套路径

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

通过ID和数据找到每个不同的值

SQL 中的第一个值和倒数第二个值

使用长 IN 子句的 SQL 优化

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

根据潜在空值的条件对记录进行计数

检索具有相同位置的最小和最大store 数量

超过100名员工的连续行

根据条件列出不同的值