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 个值,而不管它们是否重复。