你能建议一个简单的方法在Oracle 19c中计算多个列的排名吗?
For instance - considering [ Mango | 1 | 1 ] group from the table
NAME DAY PROD S M P AMT1 AMT2 AMT3
----------------------------------------------------------
MANGO 1 1 -2.75 3 15 21.277 80 80
MANGO 1 1 -2.75 1.5 21 27.778 80 80
MANGO 1 1 -2.75 3 21 27.778 80 80
MANGO 1 1 -2.75 3 14 20 80 80
Expected output : 2nd row
对于每个组[NAME, DAY, PROD],我需要确定一个具有min[abs(S)]的行价值。如果返回具有相同值[NAME, DAY, PROD, S]的多行,则要考虑的下一列是具有max(AMT1)的行。.同样,如果使用相同的[NAME, DAY, PROD, S, AMT1]获取多行,则要考虑的下一个因素是min(M).最后,最小(P).
总的来说,应为每个组[NAME, DAY, PROD]返回一行考虑将行排序为min(abs(S)) ->马克斯(AMT1)→分钟(M)→最小(P)
示例记录的期望输出: DB_Fiddle
NAME DAY PROD S M P AMT1 AMT2 AMT3 final deciding factor
----------------------------------------------------------
APPLE 1 1 -2.5 3 21 27.778 80 80 ---> min(abs(S))
APPLE 8 0.5 -1.25 3 10 51.02 90 90 ---> max(AMT1)
MANGO 5 1 -1.75 3 14 24 83.333 83.333 ---> min(P)
MANGO 1 1 -2.75 1.5 21 27.778 80 80 ---> min(M)
仅使用ROW_NUMBER()
解析函数:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY name, day, prod
ORDER BY ABS(s) ASC,
amt1 DESC,
m ASC,
p ASC
) AS rn
FROM test3 t
)
WHERE rn = 1;
对于样本数据,输出:
<表类>tbody><<tr> 名称 天 戳 S M P AMT1 AMT2 AMT3 RN苹果 1 1 -2.5 3 21 27.778 80 80 1 苹果芒果 8 。 -1.25 3 10 51.02 90 90 1 芒果 1 1 -2.75 1.5 21 27.778 80 801 表类> 5 1 -1.75 3 14 24道明> 83.333 1