Sql 在BigQuery中取消对多个数组的测试
在本例中,我有一个图书数据库,每本书有一条记录。这些记录包含书的主人、类型和一些其他信息。我需要返回每个所有者、每个流派前20名的样本,以及行中的所有数据 我有这段代码,它完成了我需要的行data_one中的一个数据点: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
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