Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从增量年值中获取旧值?_Sql_Oracle_Group By_Aggregation_Analytic Functions - Fatal编程技术网

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

Sql 如何从增量年值中获取旧值?,sql,oracle,group-by,aggregation,analytic-functions,Sql,Oracle,Group By,Aggregation,Analytic Functions,我有两张桌子: 表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 |

我有两张桌子:

表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 | |年份| 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 | |年份| 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用于表2中的CRN。应仅返回一个CID,因为对于表1中的同一CID和表2中的同一BLCK,一年可能有多个CRN。例如,对于201910,CRN 14和15具有相同的CID ABC1和BLCK A1。所以它应该返回ABC1一次
  • 上一年的BLCK值和上一年发现的CID(ABC1)的所有CRN的表1中的Cap值之和。201820始终位于201810之后,年份值始终递增为201810、201820、201910、201920。。。例如,对于201910年,我应该得到40作为上限之和,因为对于201820年的CID ABC1有两个CRN。不确定ROWNUBLE()是否将一直工作,因为我必须考虑将年从当前值返回到以前的值。<李> 我正在使用Oracle11g

    预期产出: | Year | CID |CurrYear Cap|CurrYear BLCK|Last Year|LastYear Cap|LastYear BLCK| |201910 | ABC1 | 26 | A1 | 201820 | 40 | B2 | |年份| CID | curryyear Cap | curryyear BLCK |去年|去年Cap |去年BLCK| |201910 | ABC1 | 26 | A1 | 201820 | 40 | B2|

    您可以使用
    lag()
    函数和
    年份进行分组

    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
    
    如果最后的
    中rn=1
    被rn
    替换为
    订单,则所有“年”值的所有行都列在订单中


    请以表格数据的形式向我们显示预期输出。数据结构是我们共同使用的语言。抱歉@GMB。在上面的问题中添加了。@django unchained不客气。我考虑了
    表1中的
    cab
    值,分别为15和25。很抱歉,我在预期输出中出错。能否更改您的查询以获得低于预期的结果?