经过多次尝试,我似乎无法掌握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子句的一部分,因此返回表中的所有行...
任何帮助都将不胜感激。
答案 0 :(得分:1)
PredictorData
是主键的一部分,因此t
中的每一行都会有所不同。所以它显示了该表中的所有行是正确的。这与具体的分析功能无关,如果您将这些列添加到组中,您将看到与原始版本相同的内容。
如果您希望在提供最高PredictorData
的同一行中看到PredictorStart
和SHro
,则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