首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理连续行计算

处理连续行计算
EN

Stack Overflow用户
提问于 2012-09-12 02:59:54
回答 3查看 1.4K关注 0票数 3

假设以下情况:

  • 第一周:
    • 以前的案件
    • 10个新案件
    • 3宗已解决案件

  • 第二周:
    • 7起以前的案件
    • 13个新案件
    • 15个已解决案件

  • 第三周:
    • 先前5起案件
    • 6个新案件
    • 7个已结案的案件

此信息存储在以下类型的恢复表中:

代码语言:javascript
复制
RESUME_TABLE:
WEEK    | TOTAL_NEW |   TOTAL_SOLVED
1       |   10      |   3
2       |   13      |   15
3       |   6       |   7

我很难构建一个查询来获得以下结果:

代码语言:javascript
复制
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带到下一行的想法而苦苦挣扎。

我试图使用RESUME表(Oracle11g)上的一个视图来完成这个任务。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-12 04:57:27

非常简单和简洁的分析功能:

代码语言:javascript
复制
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                                                                    
票数 3
EN

Stack Overflow用户

发布于 2012-09-12 04:51:34

您可以使用模型子句来解决这个问题:

代码语言:javascript
复制
with resume_table as
(
    select 1 week, 10 total_new, 3 total_solved from dual union all
    select 2 week, 13 total_new, 15 total_solved from dual union all
    select 3 week, 6 total_new,  7 total_solved from dual
)
select week, prev_total, total_new, total_solved, new_total
from resume_table
model
    dimension by (week)
    measures (total_new, total_solved, 0 prev_total, 0 new_total)
    rules sequential order
    (
        new_total[any] order by week = 
            nvl(new_total[cv(week)-1], 0) + total_new[cv()] - total_solved[cv()]
        ,prev_total[any] order by week = nvl(new_total[cv(week)-1], 0)
    )
order by week;

尽管这使得人们认为周总是一个连续的数字。如果这不是真的,您将需要添加一个row_number()。否则,-1可能不会引用前一个值。

看这个SQL Fiddle

票数 2
EN

Stack Overflow用户

发布于 2012-09-12 03:42:48

RESUME_TABLE中添加一列(或创建一个视图,我认为这可能更好):

代码语言:javascript
复制
RESUME_LEFT
WEEK | LEFT
1    | 7
2    | -2
3    | -1

就像这样:

代码语言:javascript
复制
CREATE VIEW resume_left
  (SELECT week,total_new-total_solved "left" FROM resume_table)

所以在REPORT_TABLE中,您可以有这样的定义:

代码语言:javascript
复制
PREV_TOTAL=(SELECT sum(left) FROM RESUME_LEFT WHERE week<REPORT_TABLE.week)

编辑

好的,这个视图是不必要的:

代码语言:javascript
复制
PREV_TOTAL=(SELECT sum(total_new)-sum(total_solved)
  FROM resume_table
  WHERE week<REPORT_TABLE.week)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12380640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档