Bri*_*ter 6 sql sql-server-2005 sql-server-2008
我正在分析一些在Count()的竞赛中使用空OVER子句的代码.
例:
SELECT
ROW_NUMBER() OVER (ORDER BY Priority DESC) AS RowID,
CAST((COUNT(*) OVER() / @pagesize) AS Int) AS TotalPages,
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么在这里使用空的OVER子句.
在我上面列出的这两行之下还有其他标准选择元素,当我从第二行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.
Run Code Online (Sandbox Code Playgroud)
一旦我把OVER()放回去,错误就消失了.
我对OVER子句的理解非常有限......我觉得我理解RowID行中发生了什么......但TotalPages行让我感到困惑.
OVER()是分析函数的一部分,并在记录集中定义分区.OVER()只是一个分区并应用于整个数据集
即COUNT(*)OVER()将在每行中返回数据集中的记录数.
请看http://msdn.microsoft.com/en-us/library/ms189461.aspx
假设我们的表是employees:
+-----------+-------+---------+
| badge_num | name | surname |
+-----------+-------+---------+
| 1 | John | Smith |
| 2 | Mark | Pence |
| 3 | Steve | Smith |
| 4 | Bob | Smith |
+-----------+-------+---------+
Run Code Online (Sandbox Code Playgroud)
跑步
SELECT surname, COUNT(*)
FROM employees
GROUP BY surname;
Run Code Online (Sandbox Code Playgroud)
我们会得到:
+---------+----------+
| surname | COUNT(*) |
+---------+----------+
| Smith | 3 |
| Pence | 1 |
+---------+----------+
Run Code Online (Sandbox Code Playgroud)
在跑步的时候
SELECT surname, COUNT(*) OVER()
FROM employees
GROUP BY surname;
Run Code Online (Sandbox Code Playgroud)
我们会得到:
+---------+-----------------+
| surname | COUNT(*) OVER() |
+---------+-----------------+
| Smith | 2 |
| Pence | 2 |
+---------+-----------------+
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,在每一行中,我们只计算整个选择(而不是单个分区)的行数。