我正在分析一些在Count()竞赛中利用空OVER子句的代码。
示例:
SELECT
ROW_NUMBER() OVER (ORDER BY Priority DESC) AS RowID,
CAST((COUNT(*) OVER() / @pagesize) AS Int) AS TotalPages,
我试图理解为什么在这里使用空的OVER子句。
我在上面列出的这两行下面还有其他标准的select元素,当我从TotalPages行的第二行中删除空的OVER子句时,出现如下错误:
Column 'TableA.Priority' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
一旦我放回OVER(),错误就消失了。
我对OVER子句的理解非常有限...我感觉好像我了解RowID行中发生的事情...但是TotalPages行使我感到困惑。
OVER()是分析功能的一部分,并在记录集中定义分区。 OVER()只是一个分区,并应用于整个数据集
即COUNT(*)OVER()将在每一行中返回数据集中有多少条记录。
说我们的表是employees
:
+-----------+-------+---------+
| badge_num | name | surname |
+-----------+-------+---------+
| 1 | John | Smith |
| 2 | Mark | Pence |
| 3 | Steve | Smith |
| 4 | Bob | Smith |
+-----------+-------+---------+
正在运行
SELECT surname, COUNT(*)
FROM employees
GROUP BY surname;
我们将获得:
+---------+----------+
| surname | COUNT(*) |
+---------+----------+
| Smith | 3 |
| Pence | 1 |
+---------+----------+
正在运行时
SELECT surname, COUNT(*) OVER()
FROM employees
GROUP BY surname;
我们将获得:
+---------+-----------------+
| surname | COUNT(*) OVER() |
+---------+-----------------+
| Smith | 2 |
| Pence | 2 |
+---------+------------------+
在第二种情况下,在每一行中,我们只计算整个select(而不是单个分区)的行数。