首页 > 解决方案 > 如何重新设计桌子?像递归 CTE

问题描述

由于 Bigquery 对递归 CTE 的支持有限,我只需要使用一些愚蠢的方法来处理这个问题。我的问题是我有一个下表:

Employee0    Employee1    Employee2    Employee3    Employee4
   A            A            B            B            B
   B            B            B            B            B
   C            A            B            B            B

这表明 B 监督 A,而 A 监督 C。

我希望我的桌子是这样的:

 Employee0    Employee1    Employee2    Employee3    Employee4
   NULL       NULL          NULL           A            B
   NULL       NULL          NULL          NULL          B
   NULL       NULL            C            A            B

我不知道如何更改表。

任何人都可以帮忙吗?谢谢!

标签: sqlgoogle-bigquery

解决方案


以下示例适用于 BigQuery 标准 SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'A' Employee0, 'A' Employee1, 'B' Employee2, 'B' Employee3, 'B' Employee4 UNION ALL
  SELECT 'B', 'B', 'B', 'B', 'B' UNION ALL
  SELECT 'C', 'A', 'B', 'B', 'B' 
)
SELECT 
  emps[SAFE_OFFSET(4)] Employee0,
  emps[SAFE_OFFSET(3)] Employee1,
  emps[SAFE_OFFSET(2)] Employee2,
  emps[SAFE_OFFSET(1)] Employee3,
  emps[SAFE_OFFSET(0)] Employee4
FROM (
  SELECT *, 
    ARRAY(
      SELECT val
      FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r':"(.*?)"')) val WITH OFFSET
      GROUP BY val
      ORDER BY MIN(OFFSET) DESC
    ) emps
  FROM `project.dataset.table` t
)   

结果

Row Employee0   Employee1   Employee2   Employee3   Employee4    
1   null        null        null        A           B    
2   null        null        null        null        B    
3   null        null        C           A           B       

推荐阅读