Как получить старое значение из дополнительных значений года? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть две таблицы:

Таблица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. CID из Таблицы 1 для CRN в Таблице 2.Должен возвращать только один CID, поскольку один год может иметь несколько CRN для одного и того же CID в таблице 1 и для одного и того же BLCK в таблице 2.Например, для 201910 CRN 14 и 15 имеют одинаковые CID ABC1 и одинаковые BLCK A1.Поэтому он должен возвращать ABC1 один раз.
  2. Значение BLCK предыдущего года и значения Sum of Cap из Таблицы1 для всех CRN для CID, найденных выше (ABC1) в предыдущем году.201820 всегда следует после 201810, а значения года всегда увеличиваются как 201810, 201820, 201910, 201920 ... Например, для 201910 я должен получить 40 в качестве суммы Cap, потому что есть два CRN для CID ABC1 для года 201820Не уверен, что rownumber () всегда будет работать, потому что я должен рассмотреть уменьшение года, чтобы вернуться от текущего значения к предыдущему.

Я использую Oracle 11g.

Ожидаемый результат:

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

1 Ответ

0 голосов
/ 03 февраля 2019

Вы можете использовать функцию lag() и 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 в конце заменяется на order by rn, тогда все строки для всех«Год» значения указаны в заказе.

Демо

...