在bigquery中,有没有一种使用sql的方法来在给定的列中为每个唯一值获取一行
我知道,使用一系列联合查询可以实现此目的,其中您拥有的联合数量与感兴趣的列中的唯一值一样多。但我想知道是否还有更好的方法。
答案 0 :(得分:2)
您可以使用row_number()
:
select t.* except (seqnum)
from (select t.*, row_number() over (partition by col order by col) as seqnum
from t
) t
where seqnum = 1;
这将返回任意行。您可以通过调整order by
来控制哪个行。
BigQuery中另一个有趣的解决方案是使用结构:
select array_agg(t limit 1)[ordinal(1)].*
from t
group by col;
如果需要特定的行,可以添加order by
(order by X limit 1
)。
答案 1 :(得分:0)
这只是一种更格式化的格式:
select tab.* except(seqnum)
from (
select *, row_number() over (partition by column_x order by column_x) as seqnum
from `project.dataset.table`
) as tab
where seqnum = 1
答案 2 :(得分:0)
以下是用于BigQuery标准SQL
#standardSQL
SELECT AS VALUE ANY_VALUE(t)
FROM `project.dataset.table` t
GROUP BY col
您可以使用下面的示例中的虚拟数据来测试,玩游戏
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 col UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 4, 2 UNION ALL
SELECT 5, 2 UNION ALL
SELECT 6, 3
)
SELECT AS VALUE ANY_VALUE(t)
FROM `project.dataset.table` t
GROUP BY col
有结果
Row id col
1 1 1
2 4 2
3 6 3