【问题标题】: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(*) 是一个聚合函数吗?
  • 马克你不认为这个问题适合两个社区吗?

标签: sql sql-server netezza


【解决方案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,则不会发生此行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多