我有一个从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
答案 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
分析函数。