需要帮助来理解SELECT查询

时间:2011-01-12 12:29:00

标签: sql sql-server tsql sql-server-2008

我有以下查询。它仅使用Northwind数据库中的一个表(Customers)。 我完全不知道它是如何工作的,它的意图是什么。我希望这里有很多DBA,所以我要求解释。特别是不知道OVERPARTITION在这里做了什么。

WITH NumberedWomen AS
(
    SELECT CustomerId ,ROW_NUMBER() OVER 
            (
                PARTITION BY c.Country 
                ORDER BY LEN(c.CompanyName) ASC
            ) 
                women 
                FROM Customers c
)

SELECT * FROM NumberedWomen WHERE women > 3 

如果需要db模式,则为here

2 个答案:

答案 0 :(得分:4)

此功能:

ROW_NUMBER() OVER (PARTITION BY c.Country ORDER BY LEN(c.CompanyName) ASC) 

为每个country内的记录分配连续的行号,按LEN(companyName)排序记录。

如果您有这些数据:

country   companyName
US        Apple
US        Google
UK        BAT
UK        BP
US        GM

,然后查询会将13的号码分配给US公司和12UK公司,按名称长度排序:

country   companyName   ROW_NUMBER()
US        GM            1
US        Apple         2
US        Google        3
UK        BP            1
UK        BAT           2

答案 1 :(得分:2)

ROW_NUMBER()是排名函数。

OVER告诉它如何创建排名。

PARTITION BY [expression] 告诉ROW_NUMBER函数在 [expression] 包含新值时重新开始排名

在您的情况下,对于每个国家/地区,都会创建一系列以1开头的数字。在一个国家内,公司按其名称的长度排序(较短的名称=较低的级别)。

最终查询:

  

SELECT * FROM NumberedWomen WHERE women> 3

选择所有客户,除非公司 - 国家/地区组合是同一国家/地区中3个最短名称的公司之一。