SQL - 使用数组
Posted
技术标签:
【中文标题】SQL - 使用数组【英文标题】:SQL - working with arrays 【发布时间】:2018-08-15 16:29:35 【问题描述】:我对 SQL 还很陌生,但在工作中必须在 BigQuery 中编写一些查询。我有一个连接不同表的查询并给出以下输出:
我们的目标是找出哪些用户 (account_ids) 曾经是订阅者,并创建一个列来表示是(如果至少有一个“y”)或否(如果都是“n”)。
如何编写一个查询,我可以在其中创建一个新列,其中:对于每个 account_id,如果 is_subsc 中至少有一个“y”,那么它将显示“yes”,如果没有与该 account_id 关联的“y”它会返回“不” 因此,对于上面的表格,它将是:
account_id ------------------------------------------------is_subscriber
1632bfb5-c294-4282-b3fb-a73061dc475a--------no
ef568b94-e621-4c36-b8da-ede623051da7--------no
6f60e841-9b60-49c9-a36f-70fc00d40f4a---------yes
ec68a446-3a7d-42fc-a79f-a71446b897cd--------yes
我将不胜感激。
【问题讨论】:
【参考方案1】:这是一种方法:
select account_id,
(select max(is_sub)
from unnest(is_subs) is_sub
) as ever_sub
from t;
这使用'y'
大于'n'
的观察结果,因此max()
适用于此编码和您的目的。不过,总的来说,我建议将这些标志存储为 真正 布尔值,而不是字符。
【讨论】:
【参考方案2】:BigQuery 标准 SQL 的另一种选择
#standardSQL
SELECT account_id,
('y' IN UNNEST(is_subs)) is_ever_subscribed
FROM `project.dataset.table`
如果适用于您问题中的虚拟数据,如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT '1632bfb5-c294-4282-b3fb-a73061dc475a' account_id, ['n'] is_subs UNION ALL
SELECT 'ef568b94-e621-4c36-b8da-ede623051da7', ['n'] UNION ALL
SELECT '6f60e841-9b60-49c9-a36f-70fc00d40f4a', ['n', 'n', 'y'] UNION ALL
SELECT 'ec68a446-3a7d-42fc-a79f-a71446b897cd', ['y', 'n']
)
SELECT account_id,
('y' IN UNNEST(is_subs)) is_ever_subscribed
FROM `project.dataset.table`
结果将是
Row account_id is_ever_subscribed
1 1632bfb5-c294-4282-b3fb-a73061dc475a false
2 ef568b94-e621-4c36-b8da-ede623051da7 false
3 6f60e841-9b60-49c9-a36f-70fc00d40f4a true
4 ec68a446-3a7d-42fc-a79f-a71446b897cd true
如果您的输出 a 必须是 y/n
与 true/false
您可以使用以下版本
#standardSQL
SELECT account_id,
IF('y' IN UNNEST(is_subs), 'y', 'n') is_ever_subscribed
FROM `project.dataset.table`
在这种情况下 - 输出将是
Row account_id is_ever_subscribed
1 1632bfb5-c294-4282-b3fb-a73061dc475a n
2 ef568b94-e621-4c36-b8da-ede623051da7 n
3 6f60e841-9b60-49c9-a36f-70fc00d40f4a y
4 ec68a446-3a7d-42fc-a79f-a71446b897cd y
【讨论】:
以上是关于SQL - 使用数组的主要内容,如果未能解决你的问题,请参考以下文章