使用Max时获取Oracle表的最高价值

时间:2013-05-29 20:15:45

标签: sql oracle

我有以下sql语句。我正在努力获得最高版本。我的查询返回多个结果,尽管按照verison desc排序。我怎样才能得到最高的一个?

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,但我一直在错过“)”错误。

由于

1 个答案:

答案 0 :(得分: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