2013-06-11 116 views
0

组由列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(TX),...)

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

是否有可能在选择使用任何其他的功能声明包含列x,y和z?

你愿意用另一个连接来添加描述性列吗?

+0

为什么您的查询使用Netezza和SQLServer标记?你在用哪个?另外,你是否认识到'count(*)'是一个集合函数? –

+0

马克你不觉得这个问题可以适用于两个社区吗? – martez

回答

0

如果列一组中的相同,只是包括他们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 

在SQL Server中使用order by (select NULL)。我不确定它是否可以在Netezza中使用。任何表达式都适用于该命令。

+0

这种方法的问题是,如果一个描述性列(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

+0

@martez。 。 。如果是这样的话,那么这个问题中的陈述就不会是真的:“每个组的列x,y和z是相同的。” –

+0

你说得对。但是,如果x,y,z发生错误,则会添加新的组/项目,这是不正确的。如果group by会在列a,b,c上定义,则不会发生此行为。 – martez