Analytic max()和partitioning子句

时间:2014-06-30 11:10:11

标签: sql oracle window-functions

经过多次尝试,我似乎无法掌握Oracle Analytic函数,所以我再次转向这里,出现了一个新问题: 我有下表:

create table TConcordance (
CurrentData     varchar2(6),
CurrentStart    date,
PredictorData   varchar2(6),
TimeFrame       varchar2(3),
PredictorStart  date,
PatternLength   number, -- l
PatternShift    number, -- h
KTau            number,
SRho            number,
Gini            number,
WeakC           number);

在(CurrentData,CurrentStart,PredictorData,TimeFrame)上创建主键。

这是我的问题:我需要在(CurrentData,TimeFrame,CurrentStart)的任意组合中检索具有最高SRho值的那些记录的CurrentStart和(在单独的查询中)PredictorStart。 在一个更大的Select Union All中,我有以下子查询按预期工作,并为每个可能的CurrentStart返回Max(SRho):

select t.CurrentData, t.TimeFrame, t.CurrentStart, max(t.SRho)
from TConcordance t, AllHistory ah
where t.CurrentData=ah.Symbol and t.TimeFrame=ah.TimeFrame
group by t.CurrentData, t.TimeFrame, t.CurrentStart

现在,这是我的问题:对于上面查询返回的每一行,我也需要检索PredictorStart列。我尝试了以下方法:

select distinct t.CurrentData, t.TimeFrame, t.CurrentStart,
    max(t.SRho) over (partition by t.CurrentData, t.TimeFrame, t.CurrentStart
        order by t.CurrentStart) "MaxSRho", t.PredictorData, t.PredictorStart

不幸的是,这似乎将添加的列视为distinct子句的一部分,因此返回表中的所有行...

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

PredictorData是主键的一部分,因此t中的每一行都会有所不同。所以它显示了该表中的所有行是正确的。这与具体的分析功能无关,如果您将这些列添加到组中,您将看到与原始版本相同的内容。

如果您希望在提供最高PredictorData的同一行中看到PredictorStartSHro,则max()在此处使用的功能错误。您可以使用first_values()获得所需内容:

select distinct t.CurrentData, t.TimeFrame, t.CurrentStart,
    first_value(t.SRho)
        over (partition by t.CurrentData, t.TimeFrame, t.CurrentStart
            order by t.SRho desc) "MaxSRho",
    first_value(t.PredictorData)
        over (partition by t.CurrentData, t.TimeFrame, t.CurrentStart
            order by t.SRho desc) "PredictorData",
    first_value(t.PredictorStart)
        over (partition by t.CurrentData, t.TimeFrame, t.CurrentStart
            order by t.SRho desc) "PredictorStart"
from AllHistory ah
join TConcordance t on t.CurrentData=ah.Symbol and t.TimeFrame=ah.TimeFrame