sql-给定列中每个不同值的单行

时间:2019-05-15 14:00:12

标签: sql google-bigquery

在bigquery中,有没有一种使用sql的方法来在给定的列中为每个唯一值获取一行

我知道,使用一系列联合查询可以实现此目的,其中您拥有的联合数量与感兴趣的列中的唯一值一样多。但我想知道是否还有更好的方法。

3 个答案:

答案 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 byorder 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