使用 OVER 的第二个最大值

Second maximum value using OVER

我正在尝试将一个需求来源与前两个不同的最高需求来源进行比较,以便我可以在 SQL 中进行一些操作。

这是我的最大值和具体需求,但我不知道如何找到第二个最大值。我看过 max(x) where x <> max(x),但我不确定如何将其用于 windows 函数。

select row_id_str, Max_NR, Max_R

from(
    select row_id_str,
        MAX(NR_close) OVER (PARTITION BY row_id_str) as Max_NR,
        MAX(R_close) OVER (PARTITION BY row_id_str) as Max_R
    from(
        SELECT  row_id_str, demand, close,
        sum(if(demand = 'root', close, 0)) as R_close,
        sum(if(demand != 'root', close, 0)) as NR_close
        FROM [scratch] group by 1,2,3
        order by row_id_str, close desc)
    group by row_id_str, NR_close, R_close)
group by 1,2,3

解决方案

select row_id_str, Max_NR, Max_R, Sum(if(RN=2, NR_close, 0)) as Second_Max
from(
    select row_id_str,  NR_close,
    MAX(NR_close) OVER (PARTITION BY row_id_str) as Max_NR,
    MAX(R_close) OVER (PARTITION BY row_id_str) as Max_R,
    ROW_NUMBER() over (partition by row_id_str order by NR_close desc) as RN
    from(
        SELECT  row_id_str, demand_rtb_name, close, sum(if(demand_rtb_name = 'rubicon', close, 0)) as R_close, sum(if(demand_rtb_name != 'rubicon', close, 0)) as NR_close
        FROM [scratch.oRubicon1_3] group by 1,2,3
        order by row_id_str, close desc)
    group by row_id_str, close, NR_close, R_close)
group by 1,2,3,

您可以将 MAXROW_NUMBER() 结合使用。

围绕它包裹一个新的 select,select 一个特定的行 WHERE RowNumber = 2

SELECT 
    tMax.row_id_str,
    tMax.MyMax,
    ROW_NUMBER() OVER (ORDER BY(tMax.MyMax)) AS RowNumber
FROM
    (SELECT 
        t.row_id_str, 
        MAX(t.NR_close)
    FROM
        table AS t
    GROUP BY
        t.row_id_str
    ) AS tMax