使用 BigQuery SQL 计算同一 ID 的所有列值的模式

Posted

技术标签:

【中文标题】使用 BigQuery SQL 计算同一 ID 的所有列值的模式【英文标题】:Calculate mode of all column values for the same ID using BigQuery SQL 【发布时间】:2021-05-06 12:15:36 【问题描述】:

假设我有一个 Bigquery 表,其中包含 idspeciesgenrelevel 列。在某些情况下,对于相同的 idspeciesgenre,我的表在多行中可能具有不同的 level 值。

最后,我希望每个 id 有 1 行,level 值作为 mode 在原始表中存在的所有 level 值中为 id

例子

#standardSQL
with `project.dataset.table` as (
  select '123' id, 'dog' species, 'suspense' genre, 3 level  union all 
  select '124', 'cat', 'love', 4 union all 
  select '123', 'dog', 'suspense', 5 union all
  select '123', 'dog', 'suspense', 5 
)
select *
from `project.dataset.table`

预期结果: 相同的数据集,每个 id 一行。例如。在上面的例子中,对于id 123 级别将是5(出现次数最多)

我怎样才能做到这一点?

[更新] 上述数据只是一个例子。我的实际数据集中有 2000 万行,超过 4 列。

【问题讨论】:

【参考方案1】:

试试这个:

with `project.dataset.table` as (
  select '123' id, 'dog' species, 'suspense' genre, 3 level  union all 
  select '124', 'cat', 'love', 4 union all 
  select '123', 'dog', 'suspense', 5 union all
  select '123', 'dog', 'suspense', 5 
)
select id, array_agg(level order by cnt desc limit 1)[offset(0)] as mode
from (
  select id, level, count(level) as cnt
  from `project.dataset.table`
  group by id, level
)
group by id

【讨论】:

以上是关于使用 BigQuery SQL 计算同一 ID 的所有列值的模式的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 计算多列值之间的重叠百分比

使用 BigQuery 将多个数据集到同一个表 id 中。

SQL - 不等左加入 BigQuery

无法使用 BigQuery 标准 SQL 提取特定 ID 的自定义维度

您可以 SQL 填充 BigQuery 表并在同一个 API 调用中设置表列模式吗?

如何使用 SQL (BigQuery) 计算 TF/IDF