繁体   English   中英

Google BigQuery:如何按特定列的值频率过滤掉行

[英]Google BigQuery: How to filter out rows by a particular column's value frequency

假设我只想返回列值至少出现两次的行。

我会做类似的事情

SELECT 
table1.columnA
from table1
GROUP BY 
table1.columnA
HAVING COUNT(*) > 2

这仅适用于一列,但如果我想返回几列但仅将过滤器应用于一列,则它不起作用。 我的尝试是

SELECT 
table1.columnA,
table1.columnB,
from table1
GROUP BY 
table1.columnA
HAVING COUNT(*) > 2

这给出了“既不是 GROUPED 也不是 AGGREGATED 的 ColumnB ”错误。

从这篇文章来看,我似乎需要将 SELECT 中的所有值进行分组或聚合,但我只有一个值可以按一个特定列进行过滤

BIGQUERY SELECT 列表表达式引用在 [10:13] 处既不分组也不聚合的 CHANNEL_ID 列

因此,我仍在尝试找出一种按特定列的值频率过滤的方法。

您可以使用窗口函数来计算频率然后过滤。 例如:

select distinct 
    columnA,
    columnB
from
    (select 
        *,
        row_number() over(partition by columnA) as rn 
     from table1)
where rn > 2

让我知道,如果它仍然不适合你。

问题一如既往,如果您只按 columnA 分组,并且分组 columA 中的每一行都有多个值,您需要选择您想要的 columnB

MIN(colunsB) would take the smalest row in the group of columA. 

对于 te 分组 columa 中的每一行,它将只返回 columnb 的一行,即最小的一行。

如果 columna 中的每一行在 columnb 中只有一行

coluanA columnB
ab      cd
ab      cd
ab1     cd1
ab1     cd1
ab1     cd1

你应该GROUP BY columnA,colmunB因为它只会返回 1 行

GRouping 的基本思想是您想要对其余列进行聚合

如果您只想使用columnA的频率过滤掉行,下面的查询将是一个最简单的解决方案。

我想分组在我的情况下不起作用,因为我只是想用它来过滤列的频率

 SELECT columnA, columnB
   FROM table1
QUALIFY COUNT(*) OVER (PARTITION BY columnA) > 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM