使用 max/aggregate 函数

Using max/aggregate functions

我正在努力使用 SQL 聚合函数,发现很难找到它们的任何用途,因为规则非常严格。谁能告诉我为什么下面的第一个查询不起作用,为什么第二个查询给出相同的行,只是顺序不同?我想要做的是找到 BORROWER_ID of 10.

最高值的日期和位置

对于第一个查询,我希望只有一行被 returned。这是 Sybase 上的 运行,但我认为 SQL 的其他版本也类似。

我看到的问题是,没有简单的方法可以告诉 SQL 我们想要 return 一行的各个列,其中有一个最大列。

1> select CREATE_LOCATION, max(CREATE_DATE) from LOAN where BORROWER_ID=10 group by CREATE_DATE
2> go
CREATE_LOCATION
--------------- -------------------------------
SSU                         Jun 18 2001  9:28AM
SSU                         Feb 12 2001 11:49AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM

(7 rows affected)
1> select CREATE_LOCATION, CREATE_DATE from LOAN where BORROWER_ID=10
2> go
CREATE_LOCATION CREATE_DATE
--------------- -------------------------------
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Sep 10 2000 10:43AM
SSU                         Jun 18 2001  9:28AM
SSU                         Feb 12 2001 11:49AM

(7 rows affected)

The problem as I see it is there's no simple way of telling SQL that we want to return various columns of a row for a single maximum column amongst them.

有一个简单的方法。它只是不使用聚合。请记住:聚合的目的是将 FROM 子句生成的多行组合成结果集中的单行。

而是使用 order by:

select l.*
from loan l
where borrower_id = 10
order by create_date desc
fetch first 1 row only;

在 Sybase 中,您将使用 top (1) 而不是 fetch:

select top (1) l.*
from loan l
where borrower_id = 10
order by create_date desc
fetch first 1 row only;

你应该使用不同的组

 select CREATE_LOCATION, max(CREATE_DATE) 
 from LOAN where BORROWER_ID=10 
 group by CREATE_LOCATION

您不应该在聚合函数和 group by 子句中使用相同的列,这是使用聚合的错误方式...

您应该在不同的列上使用聚合函数,尊重 group by 子句中的列..

Group by 子句简单地告诉数据库引擎您希望在哪一列执行聚合