【问题标题】:Analytic max() and partitioning clause解析 max() 和分区子句
【发布时间】:2014-06-30 11:10:11
【问题描述】:

尝试了几次后,似乎无法掌握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) 上创建主键。

这是我的问题:我需要检索 CurrentStart 和(在单独的查询中)PredictorStart 以获取在(CurrentData、TimeFrame、CurrentStart)的任意组合中具有最高 SRho 值的那些记录。 在更大的 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 子句的一部分,因此返回表中的所有行...

任何帮助将不胜感激。

【问题讨论】:

  • PredictorData 是主键的一部分,因此t 中的每一行都会有所不同。所以它显示所有行是正确的,确定吗?与分析没有直接关系,如果您将这些列添加到 group by,您会看到与原始版本相同的内容。还是您的意思是要显示与您获得的 max(t.SRHo) 值相对应的 Predictor* 列?
  • @AlexPoole,确实,我想显示与我从第一个查询中获得的 max(t.SRHo) 值相对应的 PredictorData 和 PredictorStart。

标签: sql oracle window-functions


【解决方案1】:

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

如果您想从提供最高SHro 的同一行中查看PredictorDataPredictorStart,那么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

【讨论】:

  • +1 只是为了能够弄清楚这是 OP 所需要的 :) 如果可以的话,我会再添加一个 +1。
  • @Alex-Poole:再次感谢您的帮助,这正是我想要的! :-)
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
相关资源
最近更新 更多