SQL:使用分组依据时的默认行为
假设我有以下疑问:SQL:使用分组依据时的默认行为,sql,sql-server,Sql,Sql Server,假设我有以下疑问: SELECT colA, colB, colC, colD FROM table GROUP BY colC, colD 此查询不会在MS SQL Server上运行,因为列colA和colB不属于group by,也不在聚合中 现在,我知道所有其他列在每个组中都具有相同的值。因此,我可以通过为colA和colB选择像MAX这样的聚合来解决这个问题,或者通过将它们添加到组中 然而,我的问题是:上面的查询只是一个示例,但我真正拥有的是几个包含大量列的非常长的查询。我想
SELECT colA, colB, colC, colD
FROM table
GROUP BY colC, colD
此查询不会在MS SQL Server
上运行,因为列colA
和colB
不属于group by,也不在聚合中
现在,我知道所有其他列在每个组中都具有相同的值。因此,我可以通过为colA
和colB
选择像MAX
这样的聚合来解决这个问题,或者通过将它们添加到组中
然而,我的问题是:上面的查询只是一个示例,但我真正拥有的是几个包含大量列的非常长的查询。我想知道的是:我是否可以为剩余的列或类似的内容设置默认聚合函数,这样我就不必手动将所有剩余的列包括在分组中,也不必手动将聚合应用于所有选择的块?否
相反,每对colC colD只能获得一行,几乎无法控制从其他列获得的值。您可以使用行编号功能
添加按组对行进行编号的列(对于每对colC colD):
在MSSQL中,不能在where子句中使用行号。如果希望每对夫妇只查看一行,则必须将所有内容都放入子查询中:
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”,更改零件按可乐、可乐订购答案是否!常规GROUP BY规则说:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。”这里有一个很好的考虑因素:如果您已经指定了ColA、ColB。。。ColN在您的选择列表中,可以很快地将它们复制粘贴到GROUP BY子句:)看起来您不需要复杂的解决方案。假设您有一辆没有轮胎的汽车,您希望添加所有轮胎。你能不能只加一个,然后期望汽车完成其余的工作?
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