2

我有一个表 t1 的结构:

  • id:整数
  • 名称:重复(字符串)

我有多个名称的条目:

  • 123; 名称1,名称2
  • 124; 姓名 1,姓名 3,姓名 4,姓名 5
  • 125; 姓名 1,姓名 4,姓名 7

我想返回名称等于name1name4的行(唯一),这将返回第 2 行和第 3 行,id 124 和 125

Bigquery 会自动展平结果。但这使得很难返回包含多个

由于某些限制,必须使用 LegacySQL 执行此操作。我试过了:

SELECT _id AS _id, GROUP_CONCAT_UNQUOTED(name) AS name where name like "%name1%" and name like "%name4%"

也尝试了 = 并且无法正常工作。

由于name1,这也返回所有行:

名称输入(“名称 1”、“名称 4”)

(名称=“名称1”或名称=“名称4”)

4

1 回答 1

2

由于某些限制,必须使用 LegacySQL 执行此操作

以下是 BigQuery 旧版 SQL

选项1

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

并将没有展平结果的目标表设置为 false(在 UI 中未选中)

选项#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 标准 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    
于 2019-09-20T18:22:02.367 回答