代码之家  ›  专栏  ›  技术社区  ›  bd528

基于最高值比较分组值

  •  0
  • bd528  · 技术社区  · 6 年前

    我有一张表格,格式如下:

    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,其中最后两个eac(由rn决定)的差异超过30%,按quoteid分组。可以忽略最大rn为1的任何QuoteID。

    因此,使用上述数据,预期输出将是:

    QUOTEID 
    193
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    一种方法使用 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 过滤到最后两行,所以 分钟() 最大() 参考最后两个值中的每一个。(这取决于哪个更大。)

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

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

    (相差30%实际上是含糊不清的,这是一个合理的解释。)