SqlServer 开窗函数

mysql中, select a,count(b) from t这种语法是可以通过的, 选出来的a列是b中的第一个值. 但是在oraclemssql中, 这种语法是不能用的, mssql会提示: 选择列表中的列'a'无效, 因为该列没有包含在聚合函数或GROUP BY 子句中. 简单点的解决办法是使用子查询:

1
select a , (select count(b) from t) from t

但是这种sql写起来比较复杂, 而且查询性能不好, 这时候就可以使用开窗函数来解决这种问题了.

开窗函数语法有两种:

  1. 聚合开窗函数, 聚合函数(row) OVER (PARTITION BY)
  2. 排序开窗函数, 排序函数(row) OVER ([?PARTITION BY] ORDER BY)
1
select a , count(b) over () from t

简单点可以理解为, 如果是聚合函数, 那么PARTITION BY即指定某些列, 聚合那些列数据相同的数据. 比如统计字段为月份, 那么就是每个月的值分别相加统计. 比起GROUP BY指定部分列统计时, 整个SELECT语句全在GROUP BY统计上灵活多了, 而且可以指定不同列来统计.
对于几个排序函数ROW_NUMBER, RANK, DENSE_RANK, NTILE来说, 可以使用OVER (ORDER BY)字句, 即指定某些字段进行ORDER BY然后得出排名, 可以在一个查询中得到多种类型的排序, 而在ORDER BY前还可以使用PARTITION BY字句, 语法和效果与GROUP BY ORDER BY一样.

作者

Mosby

发布于

2017-06-08

许可协议

评论