每两行对一列执行一次计算,并显示该组的结果

伦川肉

我有一个表(CURRENT)是从SQL查询中提取的。每个基准都有两个数据点。我需要计算两个数据点的差(即,较新的数据点-较新的数据点),并在行旁边显示结果。

我想这与分组依据有关,但这是我在sql中最薄弱的地方,我不确定如何返回结果以在分组的行旁边显示。我一直想通过做一个“按基准分组”来计算差值,然后获得MAX(VALUE)-Min(VALUE),但是意识到这很愚蠢,因为我无法知道标牌。即使我可以这样做,我也不知道如何显示计算出的值。有什么帮助吗?

谢谢。(甲骨文公司)

CURRENT				
	DATEF	    BENCHMARK	VALUE	
	31-Jul-14	A	      100	
	31-Aug-14	A	      101	
	31-Jul-14	B	      101	
	31-Aug-14	B	      99	
	31-Jul-14	C	      100	
	31-Aug-14	C	      101	
	31-Jul-14	D	      100	
	31-Aug-14	D	      100	
	31-Jul-14	E	      101	
	31-Aug-14	E	      102	
				

EITHER THIS:				
				
	DATEF	    BENCHMARK  	VALUE	DIFFERENCE
	31-Jul-14	A	        100	    1
	31-Aug-14	A	        101	    1
	31-Jul-14	B	        101     -2
	31-Aug-14	B          	99	    -2
	31-Jul-14	C	        100	    1
	31-Aug-14	C          	101	    1  
	31-Jul-14	D	        100	    0
	31-Aug-14	D        	100	    0
	31-Jul-14	E	        101	    1
	31-Aug-14	E	        102	    1



OR THIS:				
				
	DATEF	    BENCHMARK  	VALUE	DIFFERENCE
	31-Jul-14	A	        100	    
	31-Aug-14	A	        101	    1
	31-Jul-14	B	        101     
	31-Aug-14	B          	99	    -2
	31-Jul-14	C	        100	    
	31-Aug-14	C          	101	    1  
	31-Jul-14	D	        100	    
	31-Aug-14	D        	100	    0
	31-Jul-14	E	        101	    
	31-Aug-14	E	        102	    1

戈登·利诺夫(Gordon Linoff)

Oracle提供了FIRST_VALUE()LAST_VALUE()功能,它们似乎正是您所需要的。您的问题是分析/窗口功能之一,而不是聚合。

select c.*,
       (last_value(value) over (partition by benchmark order by datef range between unbounded preceding and unbounded following) -
        first_value(value) over (partition by benchmark order by datef range between unbounded preceding and unbounded following)
       ) as difference
from current c;

编辑:

或者,我认为您可以将以上内容简化为:

select c.*,
       (first_value(value) over (partition by benchmark order by datef desc) -
        first_value(value) over (partition by benchmark order by datef)
       ) as difference
from current c;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章