Big Query - Ubah urutan objek array / json menjadi kolom

Oct 21 2020

Pertanyaan ini merupakan kelanjutan dari dua pertanyaan berikut:

  1. Big Query - Mengubah urutan array menjadi kolom
  2. Big Query - Mengubah urutan bidang tertentu menjadi Kolom

Kami memiliki tabel di Big Query seperti di bawah ini.

Tabel masukan:

 Name | Question  | Answer
 -----+-----------+-------
 Bob  | Interest  | ["a"]     
 Sue  | Interest  | ["a", "b"]
 Joe  | Interest  | ["b"]
 Joe  | Gender    | Male
 Bob  | Gender    | Female
 Sue  | DOB       | 2020-10-17
 Bob  | Others    | { "country" : "es", "language" : "ca"}

Catatan: Semua nilai di kolom Answer adalah nilai yang dirangkai dan objek Arays / JSON bersifat dinamis.

Kami ingin mengubah tabel di atas ke format di bawah ini agar ramah BI / Visualisasi.

Tabel yang diinginkan:

 +-------------------------------------------------------------+
 | Name | a | b | c | Gender | DOB        | country | language |
 +-------------------------------------------------------------+
 | Bob  | 1 | 0 | 0 | Female | 2020-10-17 |   es    |   ca     |
 | Sue  | 1 | 1 | 0 |   -    |     -      |   -     |   -      |
 | Joe  | 0 | 1 | 0 |  Male  |     -      |   -     |   -      |
 +-------------------------------------------------------------+

Jawaban

2 MikhailBerlyant Oct 21 2020 at 11:38

Berikut ini untuk BigQuery Standard SQL

#standardSQL
create temp table data as
select name, question, value as answer 
from `project.dataset.table`, 
unnest(split(translate(answer, '[]" ', ''))) value
where question = 'Interest'
union all
select name, question, answer 
from `project.dataset.table`
where not question in ('Interest', 'Others')
union all
select name, 
  split(value, ':')[offset(0)] as question, 
  split(value, ':')[offset(1)] as answer 
from `project.dataset.table`, 
unnest(split(translate(answer, '{}" ', ''))) value
where question = 'Others';

EXECUTE IMMEDIATE (
  SELECT """
    SELECT name, """ || STRING_AGG("""MAX(IF(answer = '""" || value || """', 1, 0)) AS """ || value, ', ')   
FROM (
  SELECT DISTINCT answer value FROM data
  WHERE question = 'Interest' ORDER BY value
)) || (
  SELECT ", " || STRING_AGG("""MAX(IF(question = '""" || value || """', answer, '-')) AS """ || value, ', ')   
FROM (
    SELECT DISTINCT question value FROM data
    WHERE question != 'Interest' ORDER BY value
)) || """  
  FROM data 
  GROUP BY name
  """;     

jika akan diterapkan ke data sampel dari pertanyaan Anda

with `project.dataset.table` AS (
  select 'Bob' name, 'Interest' question, '["a"]' answer union all
  select 'Sue', 'Interest', '["a", "b"]' union all
  select 'Joe', 'Interest', '["b"]' union all
  select 'Joe', 'Gender', 'Male' union all
  select 'Bob', 'Gender', 'Female' union all
  select 'Sue', 'DOB', '2020-10-17' union all
  select 'Bob', 'Others', '{ "country" : "es", "language" : "ca"}' 
)    

hasilnya adalah

Catatan: EXECUTE IMMEDIATEbagian dari script diatas sama persis dengan postingan sebelumnya - perubahannya hanya pada penyiapan data original ke tabel temp datadan daripada menggunakannya diEXECUTE IMMEDIATE