如何从增量年份值中获取旧值?

时间:2019-02-03 01:31:11

标签: sql oracle

我有两个表:

表1:

|  Year  |  CRN  |  CID   | Cap |
| 201910 |  14   |  ABC1  | 12  |
| 201910 |  15   |  ABC1  | 14  |
| 201820 |  25   |  ABC1  | 15  |
| 201820 |  26   |  ABC1  | 25  |
| 201810 |  43   |  ABC1  | 10  |
| 201720 |  55   |  ABC1  | 11  |

表2:

|  Year   |  CRN  | BLCK  |
| 201910  |  14   |  A1   |
| 201910  |  15   |  A1   |
| 201820  |  25   |  B2   |
| 201820  |  26   |  B2   |
| 201810  |  43   |  C3   |
| 201720  |  55   |  C4   |
| 201720  |  95   |  F5   |
| 201710  |  65   |  D4   |

我想返回:

    表1中的Cli来自表1的CID。应该只返回一个CID,因为一年可能对于表1中的相同CID和表2中的相同BLCK具有多个CRN。例如,对于201910,CRN 14和15具有相同的CID ABC1和相同的BLCK A1。因此它应该返回一次ABC1。
  1. 上一年(ABC1)以上找到的所有CID CRN的表1中的上一年BLCK值和上限总和值。 201820总是在201810之后,并且Year值总是递增为201810、201820、201910、201920 ...例如,对于201910,我应该得到40作为上限,因为201820年的CID ABC1有两个CRN 。不知道rownumber()是否将一直有效,因为我必须考虑减少Year以从当前值返回到先前的值。

我正在使用Oracle 11g。

预期输出:

| Year  |  CID |CurrYear Cap|CurrYear BLCK|Last Year|LastYear Cap|LastYear BLCK|
|201910 | ABC1 |      26    |      A1     | 201820  |    40      |     B2      |

1 个答案:

答案 0 :(得分:2)

您可以使用lag()的{​​{1}}函数和grouping作为

year

如果最后一个select "Year", "CID", "CurrYear Cap", "CurrYear BLCK", "Last Year", "LastYear Cap", "LastYear BLCK" from ( select "Year", "CID", "CurrYear Cap", "CurrYear BLCK", lag("Year") over (order by "Year") as "Last Year", lag("CurrYear Cap") over (order by "Year") "LastYear Cap", lag("CurrYear BLCK") over (order by "Year") "LastYear BLCK", row_number() over (order by "Year" desc) as rn from ( with table1(Year, CRN, CID, Cap) as ( select 201910 , 14 , 'ABC1' , 12 from dual union all select 201910 , 15 , 'ABC1' , 14 from dual union all select 201820 , 25 , 'ABC1' , 15 from dual union all select 201820 , 26 , 'ABC1' , 25 from dual union all select 201810 , 43 , 'ABC1' , 10 from dual union all select 201720 , 55 , 'ABC1' , 11 from dual ) , table2(Year , CRN , BLCK) as ( select 201910 , 14 , 'A1' from dual union all select 201910 , 15 , 'A1' from dual union all select 201820 , 25 , 'B2' from dual union all select 201820 , 26 , 'B2' from dual union all select 201810 , 43 , 'C3' from dual union all select 201720 , 55 , 'C4' from dual union all select 201720 , 95 , 'F5' from dual union all select 201710 , 65 , 'D4' from dual ) select max(t1.year) as "Year", max(t1.CID) as "CID", sum(t1.Cap) as "CurrYear Cap", max(t2.blck) as "CurrYear BLCK" from table1 t1 join table2 t2 on t1.year = t2.year and t1.crn = t2.crn group by t1.year ) ) where rn = 1; Year CID CurrYear Cap CurrYear BLCK Last Year LastYear Cap LastYear BLCK ------ ---- ------------ ------------- ---------- ------------ -------------- 201910 ABC1 26 A1 201820 40 B2 where rn = 1替换,则所有“年”值的所有行都将列在订单中。

Demo