组聚合和描述性列
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,则不会发生此行为。以上是关于组聚合和描述性列的主要内容,如果未能解决你的问题,请参考以下文章