2011-01-12 151 views
1

我有以下查询。它仅使用来自Northwind数据库的一个表(客户)。 我完全不知道它是如何工作的,它的意图是什么。我希望这里有很多DBA,所以我要求解释。尤其不知道OVERPARTITION在这里做什么。需要帮助了解SELECT查询

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

+0

公司名称的长度与女性有什么关系?谁会给他们编号? – sjngm 2011-01-12 12:38:04

+0

@sjngm不知道,不是我的代码。开发者一定很无聊。 – 2011-01-12 13:14:29

回答

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 

,那么查询将从13US公司和1分配号码2UK公司,由名称长度,命令他们:

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

+1很棒的例子 – 2011-01-12 13:11:02

2

ROW_NUMBER()是一个排名功能。

OVER告诉它如何创建排名数字。

PARTITION BY[表达]告诉ROW_NUMBER功能重启排名每当[表达]包含一个新值

在你的情况下,每一个国家,一系列数字开始创建1。在一个国家内,公司按其名称长度(较短的名称=较低的等级)排序。

最后的查询:

SELECT * FROM NumberedWomen妇女> 3

选择所有客户,除非公司国组合的公司之一的部分与3个最短的名字在同一个国家。