我有一个表格,格式如下: -
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
答案 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%实际上是模棱两可的,这是一种合理的解释。)