繁体   English   中英

如何在 BigQuery 中转置单个列而不指定列中的所有值?

[英]How to transpose a single column in BigQuery without specifying all the values in the column?

我有以下类型的表:

col_A col_B col_C col_D
 1     ab    cd    val1
 2     cd    ef    val2
 2     cd    ef    val3
 3     ab    bc    val4

我想做的是以下几点:

col_A col_B col_C val1 val2 val3 val4
 1     ab    cd    1    0    0    0
 2     cd    ef    0    1    1    0
 3     ab    bc    0    0    0    1

基本上转置 col_4 使得其中的每个条目都有一列,值 1 表示该值存在于行中,值 0 表示它不存在于行中。

挑战在于我不知道 col_4 中可以包含的所有值,因此我需要能够创建这样的视图,而无需创建特定于 col_4 中某些值的 case 语句来创建新列。 知道怎么做吗?

希望这会有所帮助:您说您事先不知道col_D中的哪些值,因此需要使用EXECUTE IMMEDIATE动态创建数据透视查询。

CREATE TEMP TABLE sample AS
SELECT * FROM UNNEST([STRUCT
  (1 AS col_A, 'ab' AS col_B, 'cd' AS col_C, 'val1' AS col_D),
  (2, 'cd', 'ef', 'val2'),
  (2, 'cd', 'ef', 'val3'),
  (3, 'ab', 'bc', 'val4')
]);

EXECUTE IMMEDIATE FORMAT("""
  SELECT * FROM sample PIVOT (COUNT(col_A) FOR col_D IN ('%s'));
""", ARRAY_TO_STRING(ARRAY(SELECT DISTINCT col_D FROM sample ORDER BY 1), "','"));

输出:

在此处输入图像描述

如果您想在您的问题中得到完全相同的结果,请尝试使用此方法而不是之前的查询。

EXECUTE IMMEDIATE FORMAT("""
  SELECT * 
    FROM (SELECT col_A AS col, * FROM sample)
   PIVOT (COUNT(col) FOR col_D IN ('%s')) 
   ORDER BY 1;
""", ARRAY_TO_STRING(ARRAY(SELECT DISTINCT col_D FROM sample ORDER BY 1), "','"));

在此处输入图像描述

或者只是简单地

EXECUTE IMMEDIATE FORMAT("""
  SELECT * FROM sample PIVOT (COUNT(*) FOR col_D IN ('%s'));
""", ARRAY_TO_STRING(ARRAY(SELECT DISTINCT col_D FROM sample ORDER BY 1), "','"));         

带输出

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM