Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:使用分组依据时的默认行为_Sql_Sql Server - Fatal编程技术网

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