Saya memiliki tabel t1 dengan struktur:

  • id: bilangan bulat
  • nama: berulang (string)

Saya memiliki entri dengan banyak nama:

  • 123; nama1,nama2
  • 124; nama1,nama3,nama4,nama5
  • 125; nama1,nama4,nama7

Saya ingin mengembalikan baris (unik) yang memiliki nama sama dengan nama1 dan nama4 yang akan mengembalikan baris 2 dan 3, id 124 dan 125

Bigquery secara otomatis meratakan hasil. Tapi itu membuat sulit untuk mengembalikan baris yang menyertakan banyak

Dan harus melakukan ini dengan LegacySQL karena beberapa kendala. Saya sudah mencoba:

SELECT _id AS _id, GROUP_CONCAT_UNQUOTED(name) SEBAGAI nama di mana nama seperti "%name1%" dan nama seperti "%name4%"

Mencoba dengan = juga dan tidak berfungsi.

Juga yang ini mengembalikan semua baris karena name1:

nama IN ("nama1", "nama4")

( nama = "nama1" atau nama = "nama4")

2
Alexandru R 19 September 2019, 17:56

1 menjawab

Jawaban Terbaik

harus melakukan ini dengan LegacySQL karena beberapa kendala

Di bawah ini untuk BigQuery Legacy SQL

Pilihan 1

#legacySQL
SELECT id, NEST(name) name
FROM [project:dataset.table] 
GROUP BY id
HAVING SUM(name IN ('name1', 'name4')) = 2

Dan atur tabel tujuan tanpa Hasil Ratakan disetel ke false (tidak dicentang di UI)

Pilihan 2

#legacySQL
SELECT id, GROUP_CONCAT(name) name
FROM [project:dataset.table] 
GROUP BY id
HAVING SUM(name IN ('name1', 'name4')) = 2

Dengan hasil (dengan asumsi tabel itu memiliki sampel data dari pertanyaan Anda)

Row id  name     
1   124 name1,name3,name4,name5  
2   125 name1,name4,name7    

Catatan: opsi di atas menganggap tidak ada nama duplikat dalam array nama, yang kemungkinan besar adalah kasus Anda

Opsi #3 - ini sebenarnya untuk BigQuery Standard SQL - dengan asumsi Anda dapat memigrasikan barang-barang Anda ke SQL Standar

#standardSQL
SELECT id, name
FROM `project.dataset.table`
WHERE 2 = (SELECT COUNT(DISTINCT item) FROM UNNEST(name) item WHERE item IN ('name1','name4'))

Dengan hasil

Row id  name     
1   124 name1    
        name3    
        name4    
        name5    
2   125 name1    
        name4    
        name7    
2
Mikhail Berlyant 20 September 2019, 18:22