Sql 处理连续行计算

Sql 处理连续行计算,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,假设以下情况: 第1周: 0以前的案件 10宗新个案 3起已解决案件 第2周: 7以前的案件 13宗新个案 15个已解决的案件 第3周: 5起以前的案件 6个新病例 7个已解决的案件 此信息存储在以下类别的恢复表中: RESUME_TABLE: WEEK | TOTAL_NEW | TOTAL_SOLVED 1 | 10 | 3 2 | 13 | 15 3 | 6 | 7 我很难构建查询以获得

假设以下情况:

第1周: 0以前的案件 10宗新个案 3起已解决案件 第2周: 7以前的案件 13宗新个案 15个已解决的案件 第3周: 5起以前的案件 6个新病例 7个已解决的案件 此信息存储在以下类别的恢复表中:

RESUME_TABLE:
WEEK    | TOTAL_NEW |   TOTAL_SOLVED
1       |   10      |   3
2       |   13      |   15
3       |   6       |   7
我很难构建查询以获得以下结果:

REPORT_TABLE:
WEEK    |   PREV_TOTAL  |   NEW_CASES   |   SOLVED_CASES    |   NEW_TOTAL
1       |   0           |   10          |   3               |   7
2       |   7           |   13          |   15              |   5
3       |   5           |   6           |   7               |   4
这个想法似乎很琐碎,NEW_TOTAL=PREV_TOTAL+NEW_CASES-SOLVED_CASES,尽管我一直在努力将PREV_TOTAL放到下一行以便继续

我正在尝试使用Oracle 11g简历表上的视图来完成这项工作

有人能帮我提供一些示例代码吗?

在RESUME\u表中添加一列或创建一个视图,我认为这可能更好:

RESUME_LEFT
WEEK | LEFT
1    | 7
2    | -2
3    | -1
大概是这样的:

CREATE VIEW resume_left
  (SELECT week,total_new-total_solved "left" FROM resume_table)
PREV_TOTAL=(SELECT sum(left) FROM RESUME_LEFT WHERE week<REPORT_TABLE.week)
所以在REPORT_表中,可以有如下定义:

CREATE VIEW resume_left
  (SELECT week,total_new-total_solved "left" FROM resume_table)
PREV_TOTAL=(SELECT sum(left) FROM RESUME_LEFT WHERE week<REPORT_TABLE.week)
编辑

好的,视图是不必要的:

PREV_TOTAL=(SELECT sum(total_new)-sum(total_solved)
  FROM resume_table
  WHERE week<REPORT_TABLE.week)
您可以使用以下子句解决此问题:

尽管这使得我们假设周总是一个连续的数字。如果不是这样,您将需要添加一个行号。否则,-1可能不会引用以前的值


见此。

使用分析函数非常简单整洁:

12:57:06 HR@vm_xe> l                                                                    
  1  select week                                                                        
  2         ,lag(total_cases_by_now - total_solved_by_now) over (order by week) prev_total
  3         ,total_new new_cases                                                        
  4         ,total_solved solved_cases                                                  
  5         ,total_cases_by_now - total_solved_by_now new_total                         
  6    from (                                                                           
  7    select week                                                                      
  8           ,total_new                                                                
  9           ,total_solved                                                             
 10           ,sum(total_new) over(order by week asc) as total_cases_by_now             
 11           ,sum(total_solved) over (order by week asc) as total_solved_by_now        
 12      from resume_table                                                              
 13* )                                                                                  
12:57:07 HR@vm_xe> /                                                                    

      WEEK   PREV_TOTAL  NEW_CASES SOLVED_CASES  NEW_TOTAL                                
---------- ------------ ---------- ------------ ----------                                
         1                      10            3          7                                
         2            7         13           15          5                                
         3            5          6            7          4                                

3 rows selected.                                                                        

Elapsed: 00:00:00.01                                                                    

谢谢,虽然它没有真正起作用。我的实际周专栏是一个日期,这会有问题吗?另外,我对示例中的数字做了一些修改,使其更加清晰。@filippo它应该可以工作,因为sumtotal_new-sumtotal_在weekyeah处求解,我认为它有意义,尽管它只返回空列。这是实际的代码:非常简单,只更改了标签以匹配此处的问题。介意看一看吗?@filippo很抱歉,我现在没有一个可访问的Oracle,所以我不得不介意调试实际代码…你能看看这是否有效吗?的确如此。先生,你让我的夜晚值得。非常感谢。这太好了。我会仔细看看的。谢谢。嘿,关于你的模型有几个问题。这周的事情实际上不一定是连续的,但我并没有像你提到的那样,在不打破它的情况下添加行数。对不起,我以前从未使用过模型。事实上,我不仅在尝试这样做,而且还在数据中添加了一些维度,这给我带来了麻烦。如果你能帮我摆弄这把小提琴:。。外部GROUPBY只是检查数学,我真正感兴趣的是with子句中的查询。谢谢非常酷,我试图达到这样的效果,虽然我从来没有花时间学习分析:我觉得这个解决方案非常优雅,但我有问题要添加更多细节。例如,我还想按类型划分案例,所以我尝试按案例类型、按周顺序、按分区添加sumtottal\u,但没有成功是的,我在resume表中有案例类型列,对total\u cases\u by\u now字段做了相同的操作,并将其添加到许多select语句中。这是正确的方法吗?首先从分区中删除week by。这会将分析窗口压缩为仅一周,而不是当前类型的所有周。你也需要划分滞后函数,btw@filippo你能用你当前的分区测试用例更新你最初的帖子吗?嗨,最后一次更新,我成功地重现了确切的问题。介意看看这把小提琴吗