【发布时间】:2018-03-23 16:23:08
【问题描述】:
在这个例子中,我有一个图书数据库,每本书有一条记录。记录包含书的所有者、类型和其他一些信息。我需要返回每个所有者、每个流派的前 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
但是,当我尝试将其扩展为从该行中获取第二条(最终是相当多条)数据时,它会将返回的记录膨胀 200 倍:
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
我知道 UNNEST 将数组转换为表,但这是否以某种方式创建了一个数组的数组并取消嵌套?我对语法不熟悉。
编辑: 我试图获取的数据都在同一级别,所有单个数据点(无数组)和 NULLABLE STRINGS、INTEGERS、TIMESTAMPS、FLOATS 的混合
例如:
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
【问题讨论】:
-
我不确定我是否理解您的问题或您对该交叉连接的查询。但是有关使用数组的文档非常好,并且还涵盖了数组聚合(创建数组和连接数组):cloud.google.com/bigquery/docs/reference/standard-sql/…
标签: sql google-bigquery