假设我有以下问题:
SELECT colA, colB, colC, colD
FROM table
GROUP BY colC, colD
此查询不会在MS SQL Server
上运行,因为列colA
和colB
不是群组的一部分而不是聚合。
现在,我知道所有其他列在每个组中都具有相同的值。所以我可以通过为MAX
和colA
选择colB
这样的汇总来解决这个问题,或者只是将它们添加到GROUP BY
。
然而,这是我的问题:上面的查询只是一个例子,但我真正拥有的是几个非常长的查询,有很多列。我想知道的是:我可以为其余列或类似设置默认聚合函数,因此我不必须在GROUP BY
中手动包含所有剩余列手动将汇总应用于所有选择部分?
答案 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
部分。