限制排序结果

已完成

TOP 子句是 SELECT 子句的 Microsoft 专属扩展。 TOP 可用于指定要返回的行数,可以是正整数,也可以是所有符合条件的行的百分比。 行数可以指定为常量或表达式。 TOP 经常与 ORDER BY 一起使用,但也可以与无序数据一起使用。

使用 TOP 子句

与 ORDER BY 一起使用的 TOP 子句的简化语法如下所示:

SELECT TOP (N) <column_list>
FROM <table_source>
WHERE <search_condition>
ORDER BY <order list> [ASC|DESC];

例如,要仅从“Production.Product”表中检索 10 个价格最高的产品,请使用以下查询:

SELECT TOP 10 Name, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC;

结果应如下所示:

名称

ListPrice

Road-150 Red, 62

3578.27

Road-150 Red, 44

3578.27

Road-150 Red, 48

3578.27

Road-150 Red, 52

3578.27

Road-150 Red, 56

3578.27

Mountain-100 Silver, 38

3399.99

Mountain-100 Silver, 42

3399.99

Mountain-100 Silver, 44

3399.99

Mountain-100 Silver, 48

3399.99

Mountain-100 Black, 38

3374.99

TOP 运算符依赖 ORDER BY 子句来提供所选行的有意义优先级。 使用 TOP 时可以不带 ORDER BY,但在这种情况下,无法预测将返回的行。 此示例中,如果没有 ORDER BY 子句,可能会返回任意 10 个订单。

使用 WITH TIES

除了指定要返回的固定行数外,TOP 关键字还接受 WITH TIES 选项,该选项将检索可能在所选前 N 行找到其值的任何行。

在上一个示例中,查询按价格降序返回前 10 个产品。 但是,通过将 WITH TIES 选项添加到 TOP 子句,将看到更多行有资格包含价格最高产品前 10 名中:

SELECT TOP 10 WITH TIES Name, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC;

修改后的查询将返回以下结果:

名称

ListPrice

Road-150 Red, 62

3578.27

Road-150 Red, 44

3578.27

Road-150 Red, 48

3578.27

Road-150 Red, 52

3578.27

Road-150 Red, 56

3578.27

Mountain-100 Silver, 38

3399.99

Mountain-100 Silver, 42

3399.99

Mountain-100 Silver, 44

3399.99

Mountain-100 Silver, 48

3399.99

Mountain-100 Black, 38

3374.99

Mountain-100 Black, 42

3374.99

Mountain-100 Black, 44

3374.99

Mountain-100 Black, 48

3374.99

决定是否包含 WITH TIES 取决于对源数据的了解、其唯一值的可能性以及正在编写的查询的要求。

使用 PERCENT

要返回符合条件的行的百分比,请将 PERCENT 选项与 TOP 一起使用,而不是用固定数字。

SELECT TOP 10 PERCENT Name, ListPrice
FROM SalesLT.Product
ORDER BY ListPrice DESC;

PERCENT 还可以与 WITH TIES 选项一起使用。

注意

出于统计行数的目的,TOP (N) PERCENT 将向上取整到最接近的整数。

许多 SQL Server 专业人员使用 TOP 选项作为一种方法,以仅检索某特个特定范围的行。 但在使用 TOP 时,请考虑以下事实:

  • TOP 是 T-SQL 专有的。
  • TOP 本身不支持跳过行。
  • 由于 TOP 依赖于 ORDER BY 子句,因此无法:使用一种排序顺序来确定按 TOP 筛选的行,同时使用另一种排序顺序来确定输出顺序。