SQL:按分组而不使用聚合函数

时间:2018-09-10 22:04:15

标签: sql group-by aggregate-functions

我有以下SQL查询:

select * from my_table

然后返回的结果如下:

my_id    field_1    field_2   ...
 1         ...       ...
 1         ...       ... 
 1         ...       ...
 2
 3
 3

我只想为每个my_id保留一条记录,也许以field_2中的最小值记录下来

因此,我期望以下查询失败,因为我没有在select之后放置所需的聚合函数:

select * from my_table group by my_id order by my_id

但是,查询通过并返回的表没有重复的my_id。因此,我想知道是否在group by之前未指定聚合函数的情况下,SQL是否使用默认方法?

2 个答案:

答案 0 :(得分:1)

  

我期望以下查询失败,因为我没有将   所需的聚合..

不幸的是,某些SQL实现允许GROUP BY 没有聚合函数 1

在这种情况下,结果为“未定义/定义的实现”-请参阅特定的实现文档以查看其是否提供任何保证。也就是说,尽管仍保证my_id列是唯一的,但可以为其他输出字段返回任何行的

(很明显,如果my_id是键/候选键-但在这种情况下不是-那么这没有什么区别,因为只能选择一行 。 )

要获得更高的兼容性和可预测的结果,请对GROUP BY以外的每个字段使用 聚集函数 -即使特定的SQL / RDBMS不强制执行或“不需要”使用汇总。


1 当原始查询在MySQL(depending on ONLY_FULL_GROUP_BY)中被“接受”时,PostgreSQL和SQL Server都会拒绝“原始查询” “。

答案 1 :(得分:0)

您可以使用相关子查询:

select t.*
from my_table t
where t.field2 = (select min(t2.field2)
                  from my_table t2
                  where t2.my_id = t.my_id
                 );