SQL | Top-N查询

SQL中的Top-N分析 处理如何限制SQL中有序数据集返回的行数。 Top-N查询要求 N 列的最小值或最大值。最小值集和最大值集都被视为Top-N查询。遵循这种类型的搜索技术可以节省大量时间和复杂性。Top-N分析在需要只显示 最底层 或者 n顶部- 基于条件的表中的记录。该结果集可用于进一步分析。

null

例如,使用Top-N分析,我们可以执行以下类型的查询:

  • 过去两个月销售额最高的前五名产品。
  • 销售最高保单的前三名经纪人。
  • 在期末考试中得分最低的两名学生。

执行Top-N分析

通过下面提到的查询,我们可以轻松理解SQL中Top-N分析的工作原理: 语法:

SELECT [column_list], ROWNUMFROM (SELECT [column_list]      FROM table_name      ORDER BY Top-N_clolumn)WHERE ROWNUM<=N;

我们将在名为Employee的下表上执行各种命令:

图片[1]-SQL | Top-N查询-yiteyi-C++库

例1:

Input : SELECT ROWNUM as RANK, first_name, last_name, employee_id, salaryFROM (SELECT salary, first_name, last_name, employee_id      FROM Employee      ORDER BY salary)WHERE ROWNUM<=3;

输出:

图片[2]-SQL | Top-N查询-yiteyi-C++库

说明: 在上面的SQL语句中,显示了工资前三名最低的员工的必填字段。结果按工资的递增顺序显示。

例2:

Input : SELECT ROWNUM as RANK, first_name, employee_id, hire_dateFROM (SELECT first_name, employee_id, hire_date      FROM Employee      ORDER BY hire_date)WHERE ROWNUM<=3;

输出:

图片[3]-SQL | Top-N查询-yiteyi-C++库

说明: 在上面的SQL语句中,显示了最早雇佣的3名员工的必填字段。结果按雇佣日期的递增顺序显示。

使用Top-N分析的不同风格

  • 内联视图和行数: 经典的Top-N样式查询使用有序的内联视图强制数据进入正确的顺序,然后最终使用ROWNUM检查来限制返回的数据。

    例子:

Input : SELECT first_name, last_nameFROM (SELECT first_name, last_name      FROM Employee      ORDER BY salary DESC)WHERE ROWNUM<=4;
  • 输出:

图片[4]-SQL | Top-N查询-yiteyi-C++库

  • 说明: 在上面的SQL语句中,显示了薪酬最高的4名员工的必填字段。改变是由 订购人 条款
  • 嵌套的内联视图和行数: 这种方法也可以用于分页数据,比如分页的web报告。 例子:
Input :SELECT employee_id, first_name, salaryFROM   (SELECT employee_id, first_name, salary, rownum AS rnum        FROM   (SELECT employee_id, first_name, salary                FROM Employee                ORDER BY salary)        WHERE rownum<=4)WHERE  rnum>=2;
  • 输出:

图片[5]-SQL | Top-N查询-yiteyi-C++库

  • 说明: 在上面的SQL语句中,首先运行内部查询并将其输出提供给外部查询,然后外部查询最终提供所需的输出。
  • 使用秩函数: 秩分析函数为输出中的每个不同值分配一个顺序秩。 例子:
Input : SELECT dpartment_id, first_nameFROM (SELECT dpartment_id, first_name,      RANK() OVER (ORDER BY dpartment_id DESC) AS rnum       FROM Employee)WHERE rnum<=3;
  • 输出:

图片[6]-SQL | Top-N查询-yiteyi-C++库

  • 说明: 在上面的SQL语句中,RANK()函数还充当一个虚拟字段,其值在末尾受到限制。RANK()函数没有给出前N行或前N个不同的值。返回的行数取决于数据中重复的行数。
  • 使用稠密秩函数: 稠密秩分析函数类似于秩()函数。不同之处在于,等级被压缩,因此没有差距。 例子:
Input : SELECT dpartment_id, first_nameFROM (SELECT dpartment_id, first_name,      DENSE_RANK() OVER (ORDER BY dpartment_id DESC) AS rnum       FROM Employee)WHERE rnum<=3;
  • 输出:

图片[7]-SQL | Top-N查询-yiteyi-C++库

  • 说明: 在上面的SQL语句中,DENSE_RANK()函数也为重复的值分配相同的秩,但秩序列中没有间隔。因此,它总是给我们一个 前N个不同的值 后果
  • 使用行数函数: ROW_NUMBER分析函数类似于ROWNUM virtual column,但与所有分析函数一样,它的作用可以限制为基于数据顺序的特定数据输出。 例子:
Input : SELECT dpartment_id, first_nameFROM (SELECT dpartment_id, first_name,      ROW_NUMBER() OVER (ORDER BY dpartment_id DESC) AS rnum       FROM Employee)WHERE rnum<=4;
  • 输出:

图片[8]-SQL | Top-N查询-yiteyi-C++库

  • 说明: 在上面的SQL语句中,ROW_NUMBER()将只选择前N个值,而不管它们是否重复。
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享