2016-10-13 1 views
1

Oracle Express Editionデータベースで次の問合せを実行しようとしています。oracle dbms maxがすべての値を戻す

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; 

クエリの目的は、共ords(-28、151)からの最大距離と照準のためSIGHTING_IDとの距離を返すことである

テーブル目撃するための記述であります

私は、選択した最大距離を選択する代わりにクエリを実行し、照準のリスト全体とそれぞれの距離を表示します。目撃情報はタプルを大量に持っていますが、以下のMAX集約関数は、それだけで最大距離と尊敬を返すように動作するように私の質問は、私はそれをどのように作るのですされ

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 

電流出力の小さなリストですSIGHTING_ID?

答えて

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レコードを与えます。オラクル12cは+で

+0

この場合最大距離のレコードが2つある場合は、レコードの1つをスキップします。 – hemalp108

+0

それは彼が望んでいないことをどうやって知っていますか? @ hemalp108 – sagi

+0

私はあなたの答えに疑いがなく、彼は彼が何を望んでいるかを決める。私は好奇心のためにそれを求めているだけです。 – hemalp108

1

、あなたは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; 

を、@の鷺のソリューションは、おそらく最良の方法です。

+0

この種の問題の正しい解決策は、最初の/最後の集計関数です(私の答えで実証しています)。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions056.htm – mathguy

+1

@mathguyあなたの言い回しは誤解を招きます。あなたのアプローチはいくつかの*正しい解決策の1つです* Gordon Linoff'sはもう1つで、sagiはもう1つです。 –

+1

@FrankSchmitt - あなたが正しいです、私は "最高"ではなく、 "正しい"と言わなければなりません。 Oracle 12cでは、Gordonのソリューションも同様に優れています。私は以前のバージョンの彼の評価に同意しなかった。私は私のコメントを編集するが、それは不可能である。 – mathguy

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

これは最短distanceと、それらの行(とのみ)から行または行を見つける、タイは(最短distance 2個以上sighting id年代によって達成される)が存在する場合、それは選択最小のものはsighting_idです。代わりに、最大値がlatitude(たとえば)のものが、最も短いものをdistanceとしたい場合は、order by distanceorder by distance, latitude descに変更します。他の組み合わせも同様に扱われます。

関連する問題