簡體   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