📜  SQL |前 N 个查询

📅  最后修改于: 2022-05-13 01:55:07.836000             🧑  作者: Mango

SQL |前 N 个查询

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

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

  • 过去两个月销量最高的前五款产品。
  • 销售最高保单的前三名代理商。
  • 在期末考试中得分最低的两名学生。

执行 Top-N 分析

按照下面提到的查询,我们可以很容易地理解 SQL 中 Top-N 分析的工作原理:
句法:

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

我们将对下表 Employee 执行各种命令:

示例 1:

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

输出 :

解释:在上面的 SQL 语句中,为薪水最低的前 3 名员工显示了必填字段。结果以他们的薪水升序显示。

示例 2:

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

输出 :

说明:在上述 SQL 语句中,为最早入职的 3 名员工显示了必填字段。结果按雇用日期的升序显示。

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

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

    例子:

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

  • 输出 :

  • 解释:在上面的 SQL 语句中,为最高薪的 4 名员工显示了必填字段。更改由ORDER BY子句完成。
  • 嵌套内联视图和 ROWNUM :此方法也可用于对数据进行分页,例如分页的 Web 报告。
    例子:
Input :
SELECT employee_id, first_name, salary
FROM   (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;

  • 输出 :

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

  • 输出 :

  • 说明:在上面的SQL语句中,RANK()函数也作为一个虚字段,其值在最后被限制。 RANK()函数没有给我们前 N 行或前 N 个不同的值。返回的行数取决于数据中的重复项数。
  • 使用 DENSE_RANK函数: DENSE_RANK 解析函数类似于 RANK()函数。不同之处在于行列被压缩,因此没有间隙。
    例子:
Input : 
SELECT dpartment_id, first_name
FROM (SELECT dpartment_id, first_name,
      DENSE_RANK() OVER (ORDER BY dpartment_id DESC) AS rnum 
      FROM Employee)
WHERE rnum<=3;

  • 输出 :

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

  • 输出 :

  • 说明:在上面的 SQL 语句中,ROW_NUMBER() 将只选择前 N 个值,而不管它们是否重复。