1

次のSQLステートメントがあります。私は最高のバージョンを取得しようとしています。私のクエリは複数の結果を返していますが、バージョンの降順でソートされています。どうすれば最高のものを手に入れることができますか?

SELECT pv.version, pv.vin, pv.policyid, pv.segeffdate, pv.segexpdate, pv.changenum from
    nsa_al.polvehicle pv
WHERE pv.vin = '2GTEC19T011201788'
AND pv.changenum > 0
AND pv.VERSION = (SELECT MAX(PV.VERSION) FROM NSA_AL.POLVERSION)
ORDER BY pv.version DESC

rownum = 1 を使用しようとしましたが、「)」エラーが引き続き発生しました。

ありがとう

4

1 に答える 1

3

これを行うにはいくつかの方法があります。サブクエリと を含むものを次に示しますROWNUM

SELECT * 
FROM (
    SELECT pv.version, pv.vin, pv.policyid, pv.segeffdate, pv.segexpdate, pv.changenum 
    FROM nsa_al.polvehicle pv
    WHERE pv.vin = '2GTEC19T011201788'
        AND pv.changenum > 0
    ORDER BY pv.version DESC
) t
WHERE ROWNUM = 1

これは単一のレコードのみを返します。同順位が必要な場合は、RANK()代わりに分析関数を使用できます。

SELECT * 
FROM (
    SELECT RANK() OVER (ORDER BY version DESC) rnk, pv.version, pv.vin,  pv.changenum
    FROM pv
    WHERE pv.vin = '2GTEC19T011201788'
        AND pv.changenum > 0
    ORDER BY pv.version DESC
) t
WHERE rnk = 1

集計を使用する場合はMAX、共通のテーブル式を使用してテーブルを元に戻すのが最も簡単JOINです。同じバージョンのレコードが複数ある場合、これにより複数の結果が得られる可能性があります。

WITH CTE AS (
    SELECT pv.version, pv.vin,  pv.changenum
    FROM pv
    WHERE pv.vin = '2GTEC19T011201788'
        AND pv.changenum > 0
) 
SELECT * 
FROM CTE C
  JOIN (
    SELECT MAX(version) maxVersion 
    FROM CTE) C2 ON C.version = C2.maxVersion
于 2013-05-29T20:17:17.390 に答える