每2行对列执行计算并显示组的结果

时间:2014-11-27 11:31:21

标签: sql oracle

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

我想这与group by有关,但这是我在sql中最薄弱的区域,我不知道如何将结果返回到分组行旁边显示。我已经通过做一个“由BENCHMARK组”来计算差异,然后得到MAX(VALUE) - Min(VALUE),但意识到这是愚蠢的,因为我无法知道标牌。即使我能这样做,我也不知道如何显示计算值。任何帮助吗?

感谢。 (oracle请)

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

2 个答案:

答案 0 :(得分:1)

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;

答案 1 :(得分:0)

可能这个?

select benchmark, max(value) keep (dense_rank first order by datef) - 
                  max(value) keep (dense_rank last  order by datef) difference
  from current
 group by benchmark

此查询将value用于最小datef,并从value中减去最大datef。这是你想要的吗?

或者您也可以使用lag / lead分析函数。