你可能避免与分析查询自联接:
SELECT ENTITY, VERSION, LAST_VERSION
FROM (
SELECT ENTITY, VERSION,
NVL(LAG(VERSION) OVER (PARTITION BY ENTITY ORDER BY VERSION), VERSION) AS LAST_VERSION,
RANK() OVER (PARTITION BY ENTITY ORDER BY VERSION DESC) AS RN
FROM MYTABLE
)
WHERE RN = 1;
那找到目前和以前的版本,所以你可以有一个单一的观点,如果你想要得到两个。
LAG(VERSION) OVER (PARTITION BY ENTITY ORDER BY VERSION)
获取每个实体的先前版本号,对于第一个录制的版本将为空;因此在这种情况下,NVL
被用于再次采用当前版本。 (您也可以使用更多标准COALESCE
功能)。如果您有任何版本号,这也可以弥补缺陷。
RANK() OVER (PARTITION BY ENTITY ORDER BY VERSION DESC)
为每个实体/版本对分配一个连续编号,DESC
表示最高版本排名为1,次高为2等。我假定您不会有实体的重复版本 - 您可以使用DENSE_RANK
并决定如何打破关系,但这似乎不太可能。
为你的数据,你可以看到,随着生产:
SELECT ENTITY, VERSION, VALUE1,
LAG(VERSION) OVER (PARTITION BY ENTITY ORDER BY VERSION) AS LAG_VERSION,
NVL(LAG(VERSION) OVER (PARTITION BY ENTITY ORDER BY VERSION), VERSION) AS LAST_VERSION,
RANK() OVER (PARTITION BY ENTITY ORDER BY VERSION DESC) AS RN
FROM MYTABLE
ORDER BY ENTITY, VERSION;
ENTITY VERSION VALUE1 LAG_VERSION LAST_VERSION RN
---------- ---------- ---------- ----------- ------------ ----------
10000 1 10 1 2
10000 2 11 1 1 1
12000 1 50 1 1
14000 1 15 1 3
14000 2 16 1 1 2
14000 3 17 2 2 1
所有这一切都在一个内嵌视图进行,与外部查询只返回那些排名第一 - 也就是最高的行版本为每个实体。
您也可以包括VALUE1
列,例如,只是为了显示前值:
SELECT ENTITY, VERSION, VALUE1
FROM (
SELECT ENTITY,
NVL(LAG(VERSION) OVER (PARTITION BY ENTITY ORDER BY VERSION), VERSION) AS VERSION,
NVL(LAG(VALUE1) OVER (PARTITION BY ENTITY ORDER BY VERSION), VALUE1) AS VALUE1,
RANK() OVER (PARTITION BY ENTITY ORDER BY VERSION DESC) AS RN
FROM MYTABLE
)
WHERE RN = 1
ORDER BY ENTITY;
ENTITY VERSION VALUE1
---------- ---------- ----------
10000 1 10
12000 1 50
14000 2 16
那么如果只有一个版本应该怎么办?报告为空或零,还是第一个(唯一)版本?在问题中添加一些样本数据和预期输出可能会澄清事情。版本可以被删除 - 所以如果你有版本8,可能没有版本7? –
请勿使用'NATURAL JOIN'。这是一个等待发生的错误。 –
@GordonLinoff我正在使用'NATURAL JOIN',因为'INNER JOIN'给了我不需要的其他字段(如VALUE1_1)。你会推荐什么? – Chris7b