SqlServer 开窗函数
在mysql
中, select a,count(b) from t
这种语法是可以通过的, 选出来的a
列是b
中的第一个值. 但是在oracle
和mssql
中, 这种语法是不能用的, mssql
会提示: 选择列表中的列'a'无效, 因为该列没有包含在聚合函数或GROUP BY 子句中.
简单点的解决办法是使用子查询:
1 | select a , (select count(b) from t) from t |
但是这种sql
写起来比较复杂, 而且查询性能不好, 这时候就可以使用开窗函数来解决这种问题了.
开窗函数语法有两种:
- 聚合开窗函数, 聚合函数(row) OVER (PARTITION BY)
- 排序开窗函数, 排序函数(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
一样.