Impala/SQL - 可以利用 GROUP_CONCAT 和 COUNT > 1 的查询

Posted

技术标签:

【中文标题】Impala/SQL - 可以利用 GROUP_CONCAT 和 COUNT > 1 的查询【英文标题】:Impala/SQL - Query that can utilise GROUP_CONCAT and COUNT > 1 【发布时间】:2021-10-30 17:51:40 【问题描述】:

我正在寻找一种可以利用 GROUP_CONCAT 和 COUNT 的变通方法;这将带回某个类别(在本例中为 i_id,其中 c_num > 1)。请看下面:

--

选择

A1.i_id,

group_concat(DISTINCT(cast(A1.c_num as STRING)))

group_concat(DISTINCT(cast(A1.type as STRING)))

来自 A1 ;

i_id c_num type
1 1 I
1 10 J
2 15 I
2 16 I
3 3 I
4 4 I

我希望获得以下输出:

i_id c_num type
1 1,10 I,J
2 15,16 I

但我得到的是:

i_id c_num type
1 1, 10 I,J
2 15, 16 I
3 3 I
4 4 I

本质上,我希望在有 2 个或更多 c_num 计数的情况下恢复 i_id。感谢您的帮助或任何建议的解决方法。

【问题讨论】:

【参考方案1】:

您似乎希望结果集中的i_ids 有不止一行。只需使用having:

SELECT A1.i_id,
       group_concat(DISTINCT(cast( A1.c_num as STRING)))
       group_concat(DISTINCT(cast(A1.type as STRING)))
FROM A1 
GROUP BY A1.i_id
HAVING COUNT(*) > 1;

如果您特别想要超过c_num 的值,请使用:

HAVING COUNT(DISTINCT c_num) > 1

【讨论】:

非常感谢戈登的帮助!【参考方案2】:

您可以创建一个子查询来确定多个实例并将其与原始表连接以用作过滤器。

select 
group_concat(DISTINCT(cast( A1.c_num as STRING)))
from 
A1
join 
(select a1.id as a1_id, count(*) from A1 group by  a1.id having count(*)>1) cnt_gt_1
ON A1.id =cnt_gt_1.a1_id

这里的子查询 cnt_gt_1 将在您有两行或多行的地方带来数据 - 当您加入主表时,您将获得两行或多行的所有行。

【讨论】:

以上是关于Impala/SQL - 可以利用 GROUP_CONCAT 和 COUNT > 1 的查询的主要内容,如果未能解决你的问题,请参考以下文章

Impala/SQL:我可以为每个组设置不同的时间段吗?

在 Impala SQL 中写一个 While 循环?

Impala SQL - 如何计算时间戳之间的月份?

在 hive/impala sql 中按日期获取数据,

为 impala 查询打开屏幕

Impala SQL 查询