我有以下查询。它仅使用Northwind
数据库中的一个表(Customers)。
我完全不知道它是如何工作的,它的意图是什么。我希望这里有很多DBA,所以我要求解释。特别是不知道OVER
和PARTITION
在这里做了什么。
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 :(得分: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
,然后查询会将1
和3
的号码分配给US
公司和1
到2
到UK
公司,按名称长度排序:
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个最短名称的公司之一。