使用多列"order by"条件按顺序对结果进行排序和编号



all

我一直在尝试这样做,数据遵循结构:

╔══════════════╦═══════════╦══╗
║ Alphabetical ║ Numerical ║  ║
╠══════════════╬═══════════╬══╣
║ A            ║        15 ║  ║
║ A            ║        30 ║  ║
║ E            ║       100 ║  ║
║ C            ║        45 ║  ║
║ F            ║        25 ║  ║
║ C            ║        65 ║  ║
║ B            ║        25 ║  ║
║ F            ║        35 ║  ║
║ C            ║       100 ║  ║
║ A            ║        10 ║  ║
║ C            ║        20 ║  ║
║ B            ║         5 ║  ║
║ E            ║        10 ║  ║
║ F            ║        85 ║  ║
║ D            ║        30 ║  ║
║ F            ║         1 ║  ║
╚══════════════╩═══════════╩══╝

要获取以下内容:

╔══════════════╦══════╦═════════╗
║ Alphabetical ║ Rank ║ Numeric ║
╠══════════════╬══════╬═════════╣
║ A            ║    1 ║      30 ║
║ A            ║    2 ║      15 ║
║ A            ║    3 ║      10 ║
║ B            ║    1 ║      25 ║
║ B            ║    2 ║       5 ║
║ C            ║    1 ║     100 ║
║ C            ║    2 ║      65 ║
║ C            ║    3 ║      45 ║
║ C            ║    4 ║      20 ║
║ D            ║    1 ║      30 ║
║ E            ║    1 ║     100 ║
║ E            ║    2 ║      10 ║
║ F            ║    1 ║      85 ║
║ F            ║    2 ║      35 ║
║ F            ║    3 ║      25 ║
║ F            ║    4 ║       1 ║
╚══════════════╩══════╩═════════╝

基本上,要按升序对字母字段进行排序,请按降序对数字字段进行排序,并使用用于数字字段的顺序(按字母顺序字段分组(来获取顺序或排名。

只有当我将其限制为字母列中的一个特定值时,我才能实现它,方法是使用以下内容:

select ordered_src.*, ROWNUM Rank from (select src.* from Source src where alphabetical = 'A' order by Numeric desc) ordered_src;

但是我不知道如何获得上面显示的结果。知道吗?另外,是否有任何替代方案也适用于mysql/mssql/etc?

谢谢!

使用row_number()

select s.*,
row_number() over (partition by alphabetical order by numerical desc) as rank
from source s
order by alphabetical, rank;

最新更新