【问题标题】:How to produce rank in Oracle如何在Oracle中产生排名
【发布时间】:2011-03-23 17:09:34
【问题描述】:

以下需按薪资排名,薪资最高的排名第一。

显示的RANK 列是我所追求的:

Empname        sal      address           RANK
----------------------------------------------
Ram            3411     45,east road      2
Anirban        2311     34,west wind      4
Sagor          10000    34,south          1
Manisha        3111     12,d.h road       3

【问题讨论】:

  • 不要全部输入大写字母并包含一些换行符。你知道,编辑器显示了它的外观预览......

标签: sql oracle oracle10g analytic-functions top-n


【解决方案1】:

看看排名 - 样本here

【讨论】:

    【解决方案2】:

    Oracle10g 意味着您可以使用分析/排名/加窗函数,例如 ROW_NUMBER:

    SELECT t.empname,
           t.sal,
           t.address,
           ROW_NUMBER() OVER (ORDER BY t.sal DESC) AS RANK
      FROM TABLE t
    

    对于迂腐的人,如果您想看到并列获得相同的排名值,请将 ROW_NUMBER 替换为 DENSE_RANK

    如果两名雇员的薪水相同,RANK 函数将为两名雇员返回相同的排名。 但是,这会导致排名出现差距(即:非连续排名)。这与产生连续排名的dense_rank函数有很大不同。

    老派的排名方式是使用:

    SELECT t.empname,
           t.sal,
           t.address,
           (SELECT COUNT(*)
              FROM TABLE x 
             WHERE x.sal <= t.sal) AS RANK
      FROM TABLE t
    

    输出将与 DENSE_RANK 输出相匹配——平局将具有相同的排名值,同时连续编号。

    【讨论】:

    • 您可能希望更改答案以使用 RANK() 而不是 ROW_NUMBER()。 RANK() 返回平局,而 ROW_NUMBER() 任意排序带有唯一编号的平局。
    • 处理领带的要求在哪里?事实是,SELECT COUNT(*) 子选择方法会给平局相同的排名值。
    【解决方案3】:

    我经常参考这个详细、信息丰富且快速的链接Analytical Functions 来获取分析功能。

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多