我正在尝试在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?
答案 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
。其他组合的处理方式相同。