Impala 查询以获取计数聚合函数中使用的列的样本值

Posted

技术标签:

【中文标题】Impala 查询以获取计数聚合函数中使用的列的样本值【英文标题】:Impala query to get sample value of column used in count aggregate function 【发布时间】:2021-10-16 13:43:24 【问题描述】:

我在 hive 表中有大量数据。 PFB 样本行。

表:

Clid,pid,lid
1 ,1 ,OJA
1 ,2 , KLM
1, 2 , MHK
1 ,2, DNY

我想编写 impala 查询来获取每个 clid、pid 组的盖子计数以及样本值。 我知道如何获取计数,但如何获取每个 clid、pid 组的 lid 的样本值。

Select clid, pid, count(lid) frim t group by clid,pid

我应该在 impala 查询中添加什么来获得如下结果所示的示例盖子。

预期结果:

Clid, pid, count, sample lid
1, 1, 1, OJA
1, 2,3,MHK

我尝试过使用带有 over 子句的 first_val 函数,但它给出了错误。

select clid,pid, count (lid), first_value(lid) over (partition by clid, pid) from t group by clid, pid

错误:

AnalysisException:选择列表表达式不是由聚合输出产生的(缺少 GROUP BY 子句?): first_value(lid) OVER (PARTITION BY clid,pid)

【问题讨论】:

您收到什么错误?请在 first_val 函数中包含您的尝试 @ggordon 我在上面的帖子中添加了我的 first_val 查询,但有错误 【参考方案1】:

您收到此错误是因为first_value,窗口函数将为每一行生成一个值,并且不包含在您的 group by 子句中作为分组字段。

由于没有明确的顺序说明如何使用 first_val 函数检索 sample_lid(即在 over 子句中包含 ORDER BY some_field),您可以在聚合中使用 MAX 函数来提取 sample_lid,例如

select clid,pid, COUNT(lid), MAX(lid) as sample_lid
from t 
group by clid, pid

如果您确实有兴趣通过某些排序来使用 first_value 函数,您可以修改查询以添加 ORDER BY to the over clause 和/或使用 row_number 根据第一行进行过滤。

让我知道这是否适合你。

【讨论】:

以上是关于Impala 查询以获取计数聚合函数中使用的列的样本值的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句汇总——聚合函数分组子查询及组合查询

SQL聚合函数

对跨标准和变体类型列的查询执行聚合函数

mongodb上的sql查询以获取多列的计数与单列的id值

SQL查询以获取与另一列的MAX值对应的列值?

Postgres:获取对应于组中其他列的最大值的列的值