oracle dbms max返回所有值

时间:2016-10-13 11:48:05

标签: sql oracle select max aggregate-functions

我正在尝试在Oracle Express版数据库上运行以下查询。

SELECT SIGHTING_ID, MAX(DISTANCE)
FROM
(
    SELECT SIGHTING_ID,
          SQRT(POWER(LATITUDE + 28, 2) + POWER(LONGITUDE - 151, 2)) AS DISTANCE
    FROM SIGHTINGS
)
GROUP BY SIGHTING_ID;

查询的目的是返回目标的SIGHTING_ID和DISTANCE与距离合作的最大距离(-28,151)

表格SIGHTINGS的说明如下

 desc SIGHTINGS
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SIGHTING_ID                               NOT NULL NUMBER
 SPOTTER_ID                                         NUMBER
 BIRD_ID                                            NUMBER
 LATITUDE                                           NUMBER
 LONGITUDE                                          NUMBER
 SIGHTING_DATE                                      DATE
 DESCRIPTION                                        VARCHAR2(255)

当我运行查询而不是选择它选择的最大距离时,显示整个目击列表及其各自的距离。 SIGHTINGS有大量的元组,但下面是当前输出的一个小列表

 SIGHTING_ID MAX(DISTANCE)
 ----------- -------------
 264172    2.01556444
 264174    2.34029913
 264180    2.87647354
 264198    .637887137
 264205    2.08568933
 264211    .232594067
 264215    2.34104677
 264221           .75
 264224    .148660687
 264235    .684470598

我的问题是如何制作它以便MAX聚合功能起作用,使其仅返回最大距离和尊重SIGHTING_ID?

3 个答案:

答案 0 :(得分:2)

使用Oracle rownum

SELECT * FROM 
    (SELECT SIGHTING_ID, SQRT(POWER(LATITUDE + 28, 2) + POWER(LONGITUDE - 151, 2)) AS DISTANCE
     FROM SIGHTINGS
     ORDER BY distance DESC)
WHERE ROWNUM = 1

您为每个SIGHTING_ID获取记录的原因是因为您正在对其进行分组。 group by子句意味着 - >给出了条款中提到的每个列组合的1条记录。

答案 1 :(得分:1)

在Oracle 12c +中,您可以使用ANSI标准功能:

SELECT SIGHTING_ID,
      SQRT(POWER(LATITUDE + 28, 2) + POWER(LONGITUDE - 151, 2)) AS DISTANCE
FROM SIGHTINGS
ORDER BY distance DESC
FETCH FIRST 1 ROW ONLY;

在早期版本中,@ sagi的解决方案可能是最佳方式。

答案 2 :(得分:0)

select min(sighting_id) keep (dense_rank first order by distance) as sighting_id,
       min(distance)                                              as distance
from sightings;

这将找到具有最短distance的行或来自这些行(以及那些行),如果存在关系(最短distance由两个或更多{{1}实现它选择了sighting id最小的那个。相反,如果你想要那个sighting_id(比如说​​)最大的那个,仍然来自最短latitude的那个,请将distance更改为order by distance。其他组合的处理方式相同。