2011-01-12 15 views
1

私は次のクエリを持っています。 Northwindデータベースから1つのテーブル(得意先)のみを使用します。 私はそれがどのように機能し、その意図が何であるか全く分かりません。ここには多くの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

+0

@sjngm分かりません。私のコードではありません。開発者は退屈していなければなりません。 –

答えて

4

この機能は次のとおりです。

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

LEN(companyName)でレコードを注文し、各country内のレコードに連続行番号を割り当てます。

あなたは、これらのデータがある場合:

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

を、その後、クエリはUS企業や名前の長さによってそれらを注文12からUKに会社に13から番号を割り当てます

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

+1すばらしい例 –

2

ROW_NUMBER()は順位付け関数です。

OVERには、ランク番号の作成方法が記載されています。

PARTITION BY[式]はいつでも[式]はあなたのケースでは、新しい値

が含まれているランキング再起動するROW_NUMBER機能を伝えるには、すべての国のために、1から始まる一連の番号が作成されます。ある国の中では、会社はその名前の長さ(短い名前=下位)で発注されます。

最終クエリ:

SELECT *女性> 3

が、会社の国の組み合わせが3つの最短の名前を持つ企業の1の一部である場合を除いて、すべての顧客を選択しNumberedWomen FROM同じ国で

+0

+1 ____________ –

関連する問題