Как запросить одно и то же поле повторяющихся строк для нескольких значений с BigQuery устаревшего sql? - PullRequest
1 голос
/ 19 сентября 2019

У меня есть таблица t1 со структурой:

  • id: целое число
  • имя: повторяется (строка)

У меня есть записи с несколькими именами:

  • 123;имя1, имя2
  • 124;имя1, имя3, имя4, имя5
  • 125;name1, name4, name7

Я хочу вернуть строки (уникальные), которые имеют name равно name1 и name4 , которые вернутсястроки 2 и 3, id 124 и 125

Bigquery автоматически сглаживает результаты.Но из-за этого трудно возвращать строки, содержащие несколько

, и они должны делать это с LegacySQL из-за некоторых ограничений.Я пробовал:

SELECT _id AS _id, GROUP_CONCAT_UNQUOTED (name) AS имя, где имя похоже на «% name1%» и имя похоже на «% name4%»

Пробовал также с = и не работает.

Также этот возвращает все строки из-за name1:

name IN ("name1", "name4")

(name = "name1" или name = "name4")

1 Ответ

1 голос
/ 20 сентября 2019

должен сделать это с LegacySQL из-за некоторых ограничений

Ниже приведено описание BigQuery Legacy SQL

Option # 1

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

и заданотаблица назначения без значения Flatten Results, установленной в false (не проверено в пользовательском интерфейсе)

Параметр # 2

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

с результатом (при условии, что в таблице были получены данные из вашего вопроса)

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

Примечание: приведенные выше опции предполагают, что в массиве имен нет повторяющихся имен, что, скорее всего, выглядит как ваш случай

Вариант № 3 - на самом деле это для BigQuery Standard SQL - при условиивы можете перенести ваши вещи в стандартный SQL

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

с результатом

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