组聚合和描述性列

Posted

技术标签:

【中文标题】组聚合和描述性列【英文标题】:Group aggregation and descriptive columns 【发布时间】:2013-06-11 14:36:38 【问题描述】:

组由 a、b 和 c 列定义。每组的 x、y 和 z 列是相同的。示例:

a|b|c|x|y|z| ....
1 1 1 p r s 
1 1 1 p r s 
1 1 1 p r s 
2 1 2 t u v
2 1 2 t u v

我希望在不使用聚合函数 (max(t.x), ...) 的情况下实现以下目标

select  t.a, t.b, t.c,count(*), t.x, t.y, t.z, ....
from t
group by t.a, t.b, t.c;

是否有任何其他函数可用于在 select 语句中包含列 x、y 和 z?

您是否愿意使用另一个联接来添加描述性列?

【问题讨论】:

为什么您的查询同时标记了 Netezza 和 SQLServer?你用的是哪个?另外,你知道count(*) 是一个聚合函数吗? 马克你不认为这个问题适合两个社区吗? 【参考方案1】:

如果组内的列相同,只需将它们包含在group by 子句中:

select  t.a, t.b, t.c,count(*), t.x, t.y, t.z, ....
from t
group by t.a, t.b, t.c, t.x, t.y, t.z

如果你想要一个带有计数的随机行,那么使用窗口函数:

select t.*
from (select t.*,
             count(*) over (partition by a, b, c) as cnt,
             row_number() over (partition by a, b, c order by (select NULL)) as seqnum
      from t
     ) t
where seqnum = 1

order by (select NULL) 用于 SQL Server。我不确定它是否适用于 Netezza。任何表达式都适用于 order by。

【讨论】:

这种方法的问题在于,如果一个描述性列(t.x、t.y、t.z、..)与同一组的其他列不同,则会产生一个新组。在这种情况下,下面的示例将导致两组而不是一组.. a|b|c|x|y|z| .... 1 1 1 p r s 1 1 1 p r s 1 1 1 p r sa @martez 。 . .如果是这样的话,那么问题中的这个陈述就不会是真的:“每组的 x、y 和 z 列都是相同的。”。 你是对的。但是如果在 x,y,z 中发生错误,则会添加一个新的组/项目,这是不正确的。如果仅在列 a、b、c 上定义 group by,则不会发生此行为。

以上是关于组聚合和描述性列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL聚合列作为一组不同的值

如何使用 pandas 聚合组指标和绘制数据

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

Spark Scala 聚合组 Dataframe

将相同的行组聚合为一行

在 Python Pandas 中聚合组并从某个计数中吐出百分比