在Oracle 19C的多个列上排序



你能建议一个简单的方法在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;

对于样本数据,输出:

<表类>名称天戳SMPAMT1AMT2AMT3RNtbody><<tr>苹果11-2.532127.77880801苹果8。-1.2531051.0290901芒果11-2.751.52127.77880801芒果51-1.7531424道明>83.3331

最新更新