比较基于最高值的分组值

时间:2018-06-14 10:43:03

标签: sql oracle

我有一个表格,格式如下: -

QUOTEID EAC         RN
50      23642.3     2
50      23292.8     1
126     18101.1     1
193     924621.1    12
193     121967.8    11
193     127852.3    10
193     129995.1    9
199     16520.8     1

在Oracle中,我想知道是否有可能返回QUOTEID,其中最后2个EAC(由RN确定)的差异超过30%,按QUOTEID分组。任何MAX RN为1的QUOTEID都可以忽略。

因此,使用上面的数据,预期的输出将是: -

QUOTEID 
193

1 个答案:

答案 0 :(得分:3)

一种方法使用row_number()和聚合:

select quoteid
from (select t.*,
             row_number() over (partition by quoteid order by rn desc) as seqnum
      from t
     ) t
where seqnum <= 2
group by quoteid
having min(eac) < max(eac) * 0.7;

min()max()可能看起来有些奇怪。但是,where过滤到最后两行,因此min()max()会引用最后两个值中的每一行。 (这取决于哪个更大。)

你的情况是对称的,所以它并没有产生影响。如果条件不对称,则可以使用条件聚合。像这样:

having max(case when seqnum = 1 then eac end) / max(case when seqnum = 2 then eac end) between 0.7 and 1.3

(不同的是30%实际上是模棱两可的,这是一种合理的解释。)