使用 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,
您可以将 MAX
与 ROW_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
我正在尝试将一个需求来源与前两个不同的最高需求来源进行比较,以便我可以在 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,
您可以将 MAX
与 ROW_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