俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

T-SQL :TOP和OFFSET-FETCH筛选 (五)

可以认为加强版 TOP 功能  OFFSET-FETCH 子句被视为order by 子句的一部分   offset 子句 跳过多少行,  fetch 子句显现多少行

3.WITH TIES 参数

TOP选项中加入PERCENT关键字 寻找最近产生1%订单

  如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回指定的行数。如果没有 ORDER BY 子句,TOP 筛选将按照行的物理顺序返回指定的行数。

SELECT TOP (1) PERCENT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC;

 

注意:即使没有排序order by 子句 TOP选项排序也是不明确的,SQL Server 会返回首先物理访问到N 行数据 而不是根据表顺序。

  可以使用百分比,如果遇到百分比的计算结果不是整数,将向上舍入(即“进一法”,而不是“四舍五入”或“截尾取整”)。例如,返回前10%的行:

缺点是 不支持PERCENT和WITH TIES  选项 而TOP 支持

 

搞不懂一点的是TOP查询返回的是表结果还是游标?, 一般带order by子句的查询返回是一个游标,而不是一个关系结果。

 

应该注意的是  一个sql语句出现 top 和order by时 order by 是被计算了两遍   第一次 先对数据进行显示排序  第二次为TOP定义筛选。

  SELECT ColumnA, ColumnB FROM Table1 ORDER BY ColumnA OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY

前面写过order by子句是在select 子句之后计算的, select又包含disinct选项 ,所以dinsinct 计算顺序大于top 在对数据去重复后再进行top计算

1. 跳过指定的行数

建议 如果只使用筛选行数功能 请使用 OFFSET-FETCH  因为它是标准SQL 而TOP不是 除非需要PERCENT和WITH TIES  选项 仅仅只是筛选行数不建议用TOP

2. 返回指定百分比的行

1.TOP筛选

俄罗斯贵宾会,  SELECT ColumnA, ColumnB FROM Table1 ORDER BY ColumnA OFFSET 10 ROWS

OFFSET-FETCH 子句必须在 orderd by 后面     可以只要有 fethch   但没有fetch 是不行的

  FETCH 子句指定在处理 OFFSET 子句后,将返回的行数。FETCH 子句的参数可以是大于或等于 1 的整数或表达式。例如:

2.OFFSET-FETCH 筛选

1. 返回指定数目的行

用于限制查询返回行数或者行数的百分比。

  行数可以使用返回整数值的任何算术、常量或参数表达式,但不可以使用标量子查询。

SELECT TOP (5) WITH TIES orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC;

4. 行数的表达式

 

  在与ORDER BY 子句组合使用时,有时候会出现并列排名的情况,例如,返回前10名优秀成绩的学生,可能遇到多名学生并列第10名。此时需要指定 WITH TIES,以确保并列第10名的学生都被包含到结果集中,此时的结果集可能多于10行。示例:

这是通过 排序对数据进行筛选

 

通过were和having条件可以对数据进行筛选,那么如何通过排序对数据进行筛选呢?

2. 跳过指定的行数,再返回指定的行数

以上是跳过50行 显示25行 

SQL Server 对行数的排序提供了 TOP 筛选。SQL Server 2012 新增了 OFFSET 筛选。

以日期作为排序字段 会出现 多行具有相同的订单日期 每次执行都有不确定性会返回不一样的结果,所有要确保排序字段的唯一性。

 

问题来了 如果问题已经存在不能确保唯一性 那如何解决呢? 我们可以加入WITH TLES选项 主要作用返回表中 最后匹配一行所有结果防止因为行同源导致返回数据不一致。

 

本文由俄罗斯贵宾会发布于数据库,转载请注明出处:T-SQL :TOP和OFFSET-FETCH筛选 (五)

您可能还会对下面的文章感兴趣: