Нужна помощь в понимании запроса SELECT - PullRequest
1 голос
/ 12 января 2011

У меня следующий запрос.Используется только одна таблица (Customers) из базы данных Northwind.Я совершенно не знаю, как это работает, и каково его намерение.Я надеюсь, что здесь много администраторов баз данных, поэтому я прошу объяснений.в частности, не знаю, что здесь делают 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 

Если вам нужна схема БД, то здесь

Ответы [ 2 ]

4 голосов
/ 12 января 2011

Эта функция:

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
2 голосов
/ 12 января 2011

ROW_NUMBER() - функция ранжирования.

OVER рассказывает, как создавать ранговые числа.

PARTITION BY [выражение] сообщает ROW_NUMBER функция перезапуска ранжирования всякий раз, когда [выражение] содержит новое значение

В вашем случае для каждой страны создается серия чисел, начинающихся с 1.В пределах одной страны Компании упорядочены по длине своего имени (более короткое имя = более низкий ранг).

Окончательный запрос:

ВЫБРАТЬ * ИЗ НОМЕРНЫХ ЖЕНЩИН ГДЕ женщины> 3

выбирает всех клиентов, кроме случаев, когда комбинация компания-страна является частью одной из компаний с 3 самыми короткими именами в одной стране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...