Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在BigQuery中取消对多个数组的测试_Sql_Google Bigquery - Fatal编程技术网

Sql 在BigQuery中取消对多个数组的测试

Sql 在BigQuery中取消对多个数组的测试,sql,google-bigquery,Sql,Google Bigquery,在本例中,我有一个图书数据库,每本书有一条记录。这些记录包含书的主人、类型和一些其他信息。我需要返回每个所有者、每个流派前20名的样本,以及行中的所有数据 我有这段代码,它完成了我需要的行data_one中的一个数据点: WITH `project.dataset.table` AS ( SELECT Name name, Genre genre, Data_one org FROM `project.dataset.booktable` ), search

在本例中,我有一个图书数据库,每本书有一条记录。这些记录包含书的主人、类型和一些其他信息。我需要返回每个所有者、每个流派前20名的样本,以及行中的所有数据

我有这段代码,它完成了我需要的行data_one中的一个数据点:

WITH `project.dataset.table` AS (
  SELECT 
    Name name, 
    Genre genre, 
    Data_one org
  FROM `project.dataset.booktable`
), search AS (
  SELECT name, genre FROM
  UNNEST(['Alex','James']) name, 
  UNNEST(['HORROR','COMEDY']) genre
)
SELECT name, genre, org 
FROM (
  SELECT t.name, t.genre, ARRAY_AGG(t.org LIMIT 20) orgs
  FROM `project.dataset.table` t JOIN search s 
  ON LOWER(s.name) = LOWER(t.name) 
  AND LOWER(s.genre) = LOWER(t.genre) 
  WHERE RAND() < 0.5
  GROUP BY t.name, t.genre
), UNNEST(orgs) org
ORDER BY name, genre, org

由于您的问题泄露了细节,下面的答案只是供您探索的方向

标准SQL 从中选择名称、流派、数据一、数据二 选择t.name、t.genre、ARRAY_AGGt.org LIMIT 20 orgs、ARRAY_AGGt.org2 LIMIT 20 orgs2 来自`project.dataset.table`t联接搜索 ON.name=LOWERt.name 和LOWERs.genre=LOWERt.genre 其中RAND<0.5 按t.名称、t.类型分组 ,UNNESTorgs data_one带有偏移量pos1 ,UNNESTorgs2数据,偏移量为2 其中pos1=pos2 按名称、流派、数据排序 正如您所看到的,这里引入了偏移量来标识数组中元素的位置,然后只留下那些具有相同位置的组合

在实际用例中-您很可能还有另一个字段,用于标识哪些数据1和数据2属于同一行,该字段可用于将这些数据1和数据2配对

希望这能帮你找到方向

更新

添加模式/示例时-请参见下文

标准SQL 选择名称、流派、data.data\u一、data.data\u二、data.data\u三、data.data\u四 从…起 选择t.name、t.genre、, 数组1,数据2,数据3,数据4限制20个数据 来自`project.dataset.table`t联接搜索 ON.name=LOWERt.name 和LOWERs.genre=LOWERt.genre 其中RAND<0.5 按t.名称、t.类型分组 ,UNNESTdata数据 按名称、流派排序
这正是我在另一篇文章中对你的第一个相关问题的评论中提到的。你可以在你的select语句中使用org.data_one,org.data_two

我不确定我是否理解你的问题或你的交叉连接查询。但是有关使用阵列的文档非常好,还涵盖了阵列聚合创建阵列和连接阵列:
WITH `project.dataset.table` AS (
  SELECT 
    Name name, 
    Genre genre, 
    Data_one org,
    Data_two org2
  FROM `project.dataset.booktable`
), search AS (
  SELECT name, genre FROM
  UNNEST(['Alex','James']) name, 
  UNNEST(['HORROR','COMEDY']) genre
)
SELECT name, genre, org, org2 
FROM (
  SELECT t.name, t.genre, ARRAY_AGG(t.org LIMIT 20) orgs, ARRAY_AGG(t.org2 LIMIT 20) orgs2
  FROM `project.dataset.table` t JOIN search s 
  ON LOWER(s.name) = LOWER(t.name) 
  AND LOWER(s.genre) = LOWER(t.genre) 
  WHERE RAND() < 0.5
  GROUP BY t.name, t.genre
), UNNEST(orgs) org, UNNEST(orgs2) org2
ORDER BY name, genre, org, org2
Genre   STRING  NULLABLE
Name    STRING  NULLABLE    
Data_one    STRING  NULLABLE    
Data_two    STRING  NULLABLE    
Data_three  INTEGER NULLABLE    
Data_four   TIMESTAMP   NULLABLE    

Owner   |   Genre    |   Data_one    | Data_two   |Data_three|Data_four
Alex    |   Horror   |  Stephen King |    IT      |    3     |2018-01-02
Alex    |   Sci-fi   |   Andy Weir   |The Martian |    5     |2018-01-02
James   |   Horror   |  Bram Stoker  |   Dracula  |    2     |2018-01-02
Sarah   |   Horror   |  Stephen King | The Stand  |    3     |2018-01-02
James   |   Horror   |  Stephen King |Pet Sematary|    2     |2018-01-02