SQL-什么时候使用空的OVER子句?

问题描述 投票:8回答:2

我正在分析一些在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行使我感到困惑。

sql sql-server-2005 sql-server-2008
2个回答
10
投票

OVER()是分析功能的一部分,并在记录集中定义分区。 OVER()只是一个分区,并应用于整个数据集

即COUNT(*)OVER()将在每一行中返回数据集中有多少条记录。

查看此http://msdn.microsoft.com/en-us/library/ms189461.aspx


0
投票

说我们的表是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(而不是单个分区)的行数。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.