SQL:使用GROUP BY时的默认行为

时间:2016-04-26 08:47:20

标签: sql sql-server

假设我有以下问题:

SELECT colA, colB, colC, colD  
FROM table  
GROUP BY colC, colD

此查询不会在MS SQL Server上运行,因为列colAcolB不是群组的一部分而不是聚合。

现在,我知道所有其他列在每个组中都具有相同的值。所以我可以通过为MAXcolA选择colB这样的汇总来解决这个问题,或者只是将它们添加到GROUP BY

然而,这是我的问题:上面的查询只是一个例子,但我真正拥有的是几个非常长的查询,有很多列。我想知道的是:我可以为其余列或类似设置默认聚合函数,因此我必须在GROUP BY中手动包含所有剩余列手动将汇总应用于所有选择部分?

1 个答案:

答案 0 :(得分:2)

NO。

相反,对于每对colC-colD ,您只能获得一行,而几乎无法控制从其他列获得的值。您可以使用行编号功能。

添加一个按行分组的列(对于每对 colC-colD ):

select colA, colB, colC, colD, 
row_number() over (partition by colC, colD order by colA, colB) as Sequence
FROM table  

在MSSQL中,您不能在where子句中使用row_number。如果您希望每对 colC-colD 只能看到一行,则必须将所有内容放在子查询中:

select colA, colB, colC, colD
from (
  select colA, colB, colC, colD, 
  row_number() over (partition by colC, colD order by colA, colB) as Sequence
  FROM table  
) T
where Sequence = 1

使用此方法,您只能看到所有其他列中的一行,但您无法选择聚合函数

您可以选择的是订单条件,这意味着哪一行的数字为“1”,更改了order by colA, colB部分。