BigQuery - 在BigQuery中仅选择第一行

12

我有一个包含数据的表格,其中在A列中有一组重复的数据(连续出现)。

我想根据仅列A中的值选择每组的第一行(没有其他条件)。请注意,对于所找到的新行,我还想选择所有相应的列(我不想将它们排除在外)。

有人能帮我写一个正确的查询吗?

这是一个样例:SAMPLE

谢谢!


你能分享一些样本数据以及你目前尝试过的方法吗? - Ben P
嗨@BenP,我在评论中添加了Excel中我的样本数据的图片(因此我不知道如何在评论中添加它:D)。您可以看到,在REFERENCE列中,例如,在第2、3、4行中,我有相同的数据,而我只想显示第一行。我尝试了一些查询,但对我没有用。此外,选择的行必须具有所有相应的列也很重要。 - zerina
5个回答

11
#standardSQL
SELECT row.*
FROM (
  SELECT ARRAY_AGG(t LIMIT 1)[OFFSET(0)] row
  FROM `project.dataset.table` t
  GROUP BY columnA
) 

2
谢谢@Mikhail。您有没有想过与使用等效的row_number()解决方案相比,性能如何? - Jordan Arsenault

8
你可以尝试像这样做:

你可以尝试这样做:

#standardSQL
SELECT
   * EXCEPT(rn)
FROM (
   SELECT
   *,
   ROW_NUMBER() OVER(PARTITION BY columnA ORDER BY columnA) AS rn
FROM
   your_dataset.your_table)
WHERE rn = 1

会返回:

Row   columnA       col2       ...   
1     AC1001        Z_Creation   
2     ACO112BISPIC  QN
...

你好,感谢你的帮助。你提供的方法确实有效。但是,我需要它在整个表格上运行,而不仅仅是在我给出的示例上。此外,我需要所有现有的列也显示出来,正如我在评论和帖子中所述。 - zerina
请选择您的表格,而不是我的示例,并选择* EXCEPT(rn)。帖子已编辑。 - Vasily Bronsky

6
在查询末尾添加 LIMIT 1,类似以下示例:
SELECT name, year FROM person_table ORDER BY year LIMIT 1

5

您现在可以使用qualify来实现更简洁的解决方案:

select
   *
from
   your_dataset.your_table
where true
qualify ROW_NUMBER() OVER(PARTITION BY columnA ORDER BY columnA) = 1

QUALIFY和窗口函数在性能方面有何不同? - Zaar Hai
P.S. QUALIFY 仍处于预览状态。 - Zaar Hai

1
在BigQuery中,行的物理顺序并不重要。“BigQuery不能保证表中行的稳定排序。只有带有明确ORDER BY子句的查询结果具有良好定义的排序。”[1]
首先,您需要确定哪个属性将决定您组的第一行,然后可以通过更改ORDER BY来运行Vasily Bronsky的查询以使用该属性。这意味着您应该向表中添加另一列以存储行的顺序,或者从您已有的列中选择一个列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接