使用 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 子句简单地告诉数据库引擎您希望在哪一列执行聚合
我正在努力使用 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 子句简单地告诉数据库引擎您希望在哪一列执行聚合