2013-05-29 44 views
1

我有以下sql語句。我試圖獲得最高版本。我的查詢返回多個結果,儘管按verison desc排序。我怎樣才能得到最高的?在使用Max時獲取Oracle表的最大值

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,但我一直在錯過「)」錯誤。

謝謝

回答

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 
+0

的感謝!我提供的vin實際上是我程序中的一個變量。所以我需要這個sql語句來爲許多可能的策略和/或vin號碼提供最大版本。第一個人會爲此工作嗎?它爲那個特定的vin工作。 – bucs10us

+0

@ bucs10us - 如果你需要通過vin進行分組,那麼我會使用分析函數而不是ROWNUM - 試試這個:http://sqlfiddle.com/#!4/91d07/2 - 但是如果你是提供vin,然後任何這些選項應該工作。親切的問候。 – sgeddes

+0

我的程序正在拉多個酒和政策ID。我不知道哪一個在另一個數據庫中會有匹配。我需要確保當我運行我的查詢時,它將爲所有的vins和策略ID選擇最大版本。我可以有兩個酒單和政策ID,但每個VIN或政策的數百個版本。這是我需要選擇最高或最高版本的地方。我認爲這會起作用。謝謝@sgeddes – bucs10us

相關問題