1.Over() 定义理解
Over()开窗函数指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。
简单来说就是,Over() 不需要 Group By 即可实现分组统计,因为Over 里面的参数就可以实现分组
2.可选参数
over([partition by ] <order by >)
[partition by ]:即以什么字段为唯一键去分组,可以多个字段组成键
<order by >:即分组后以什么字段去排序
3.常用举例
开窗函数 Over() 通常结合 ROW_NUMBER() 、Count() 函数可以实现数据库的翻页查询,并且返回总条数。
这里新建一张测试表,插入20条数据,每个字段都是整型,数据如下:
假设,现在想要翻页查询表数据,且按aa 倒序、bb升序、cc倒序的排列,去获取第二页数据,每页10条数据,那么sql语句如下:
SELECT TOP 10 * FROM (
SELECT *,ROW_NUMBER() OVER (ORDER BY aa DESC,bb ASC,cc DESC) Rank,COUNT(1) OVER() AS TotalItem FROM test WITH(nolock)
) t
WHERE Rank > (2 - 1) * 10 -- 这里是公式(pageIndex-1)*pageSize
ORDER BY Rank
注意:
ROW_NUMBER() OVER (ORDER BY aa DESC,bb ASC,cc DESC) Rank
这句话是为了给数据结果集编号,且排序
COUNT(1) OVER() AS TotalItem
这句话是为了直接求出结果集总条数,而用于后台逻辑去计算总页数并返回前端
上述sql的查询结果如下: