MSSQLのウィンドウ関数

免責事項:感傷的執拗な痛みが好き、だけでなく、Qianwan Lvをインチにしないでください。ときの角度有限地平線、唯一アカシア無限の場所。https://blog.csdn.net/u011078141/article/details/91268197

開発者が懸念しているように、私は、彼は本当に「読んで、それのない精神ことができなかった多くの年の職場でBaihunを感じるプログラマのSQLゴールデン」この電子書籍を、私は本当に学ぶことはありません少しの知識は、本当にこの電子書籍のように、本の内容を説明することは理解することが、より良いだけでなく、より実用的です。著者は、ハードワークの:)に感謝します。

今日はSQL Severの窓関数を導入される、どのようなウィンドウ機能、それを理解していません。とにかく、私のために、私が聞いた初めて、困惑ました。だから、実際には、集計機能の拡張版として理解することができ、ウィンドウ関数ものです。(ケースサブクエリを除く)を集計関数ので、全体のクエリは、戻り値列を重合するが、根底にある行の戻り値を持たないことができます。だから、ベースラインの戻り値の必要性は、その後、あなたは彼らが解決することができます前に、複雑なサブクエリまたはストアドプロシージャを使用する必要があります。しかし、窓関数を使用して簡単に同じ行および列の集合に同時に列ベースラインを返すことができ、解決することができます。ISO SQLでDB2 OLAP関数で呼び出されている間、Oracleは、分析関数と呼ばれ、そのような窓関数としての機能を提供します。

関数重合機能を窓掛け、重合を算出する行のグループに設定されています。データが同時に同じ行に戻すことができるグループにGROUP BY句を使用せず、それは値のセットを操作して、行定義ウィンドウ(オペレータが操作される行の集合である窓)として使用され重合列をベース行と列。とにかく、私はこの機能がうまくサブクエリを使用またはその他のマージ私に集計列の値を取得されています理解しています。

ステップの説明によって本ステップの例で、あなたはすべての従業員の合計数を計算したいとして、我々は次のSQL文を実行することができます。

SELECT  COUNT(します。FName)FROM T_Person

この方法では直接比較、重合カラムのみ戻り値は、行単位の列の値はありません。しかし、時には我々は、集約関数は、重合に計算列(すなわち列ベースライン)の値にアクセス並ぶことはありません必要があります。例えば、我々はより少ない5000元(都市と年齢)より各従業員の賃金に関する情報をチェックして、すべての賃金少ない5000元以上の従業員の数を表示したいと思い、各行に次のSQL文を記述してみてください:

SELECTします。FName、FCITY、FAGE、FSalary、COUNT(ます。FName FROM T_Person
 FSALARY < 5000

上記のSQLを実行した後、私たちは、次の取得エラー
リストの列を選択する「T_Person.FCity」は、集計関数またはGROUP BY句に含まれていない無効なため。
これはすべてのためであるGROUP BY句で列が集計関数に含まれていないと宣言しなければならないサブクエリを使用する方法を解決することができます:

コードをコピー
SELECT します。FName、FCITY、FAGE、FSalary、 
SELECT  COUNT(ます。FName)FROM T_Person
 FSALARY < 5000 FROM T_Person
 FSALARY < 5000
コードをコピー

サブクエリの使用は、この問題を解決することができますが、サブクエリの使用が非常に面倒ですが、機能をウインドウの使用は、あなたは非常にあなたが達成するためのウィンドウ関数を使用する場合と同じ効果を示すために、次のSQL文を実装を簡素化することができます。

SELECTします。FName、FCITY、FAGE、FSalary、COUNT(ます。FName)OVER ()
 FROM T_Person
 FSALARY < 5000

異なる機能は、重合がキーワードOVER機能を追加した後、重合が機能を窓掛けしていることがわかります。
関数呼び出しの形式を窓掛けすることである:関数名(列)OVER(オプション)

、SQL Serverはまた、ORDER BY句で使用されるウィンドウ関数をサポートして開始したときに知らない、私はここで使用されるSQL Server 2008 R2のです(注:ブックは、MSSQLServerサービスがORDER BY句でウィンドウ関数によってサポートされていないと言います)。とにかく、ここで私はオンライン関連するコンテンツを統合します。ウィンドウイング関数は2つのカテゴリに分類された後、ウィンドウ関数のORDER BY句をサポートしているためです。

第一のカテゴリー:重合窓関数 ====「集合関数(カラム)OVER(オプション)、オプションのPARTITION BY句であってもよい、ORDER BY句ではありません

第二のカテゴリー:ソート機能を窓掛け ====」(オプション)OVERソート機能(列)は、このオプションでは、ORDER BY句は、OVER(ORDER BY句句のORDER BY PARTITION)することができあってもよいが、 PARTITION BY句ではありません

 

重合ウィンドウ関数

 

キーワードOVER代わりに集合関数の重合窓関数としてその集計機能を示します。使用されているすべての標準SQLの集計関数重合ウィンドウ関数を可能にします。
上記の例では、窓関数のCOUNT(*)(OVER)各行のクエリ結果におけるすべての適格な行の数を返します。キーワードオプションウィンドウの範囲の後OVER括弧は、多くの場合、重合操作を変更するために追加されます。OVERオプションの後の括弧内のキーワードは、重合操作の結果セットに、すべての行のウィンドウ関数空の場合。

 

PARTITION BY句

 

オーバー窓関数の鍵括弧は、重合のた​​めに計算するBY句区画線パーティションを定義するために使用することができる後。BY句異なるグループと、句のパーティションBY PARTITION作成したが、結果セットの独立している、唯一の計算重合用に作成されたパーティション、および異なるパーティションには、ウィンドウ関数がお互いに影響を与えません作成しました。次のSQL文は、人事情報の数だけでなく、都市が一人一人に属しているを示しています。

SELECT します。FName、FCITY、FAGE、FSalary、
 COUNT(ます。FName)OVER(PARTITION BY FCITY)
 FROM T_Person

OVER(PARTITION BY FCITY)が記載FCITYを分割結果セットを表し、そして重合における現在の行がグループ結果に属して算出します。同じSELECT文では、同時に複数のウィンドウ関数、ウィンドウ関数を使用することができ、互いに干渉しません。例えば、それぞれの人の数については、以下のSQLステートメント情報、市や仲間の当業者の数は示しています。

SELECT します。FName、FCITY、FAGE、FSalary、
 COUNT(ます。FName)OVER(PARTITION BY FCITY)、
 COUNT(ます。FName)OVER(PARTITION BY FAGE)
 FROM T_Person

 

ソートウィンドウ関数

 

懸念されるウィンドウ関数を注文するためには、ウィンドウ関数をサポートしています:ROW_NUMBER(行番号)、RANK(ランク)、DENSE_RANK(密ランク)とNTILE(ランキンググループ化)。

SQLステートメントを探します。

コードをコピー
選択し  ます。FName、FSalary、FCity、FAge、   
ROW_NUMBER()オーバー順序 によって FSalary)としてROWNUM、   
ランク()オーバー順序 によって FSalary)としてランク、   
DENSE_RANK()の上に順序 によって FSalary)としてDENSE_RANK、   
NTILE(6順序 によって FSalary)としてNTILE 
 から  T_Personの 
 順序 により   ます。FName  
コードをコピー

 次のような結果の実装は、(。自分の友人を試してみたい人のために、あなたは、ハードポイントを持って、私は限られたスペースだからああのほとんどを省略し、電子書籍をダウンロードしたり、それを学ぶために本を買う)は次のとおりです。

 

以下の関連の内容を紹介し、それ以上の結果を参照してください。我々が得る最終結果がします。FNameに応じて昇順に表示されています。

ROW_NUMBER()のためにオーバー注文 によって FSalary)AS ROWNUM、この種を参考にして得られた結果を昇順で並べ替え、およびソートするFSalaryウィンドウ関数をベースに

ランク()のために注文 により FSalary)AS ランク、この関数はFSalaryとして説明ソートを昇順にソートし、その結果得られたランク数をソートすることです。ランクの後のランクのために結ばれ、評価結果がランキング外に配置することができる。この機能は、単に誰もが最初の場所のために結ば唯一のランク、2つの状況であると言う(ビンの数と一緒に接続され、この時間は2になりました最初の場所の背後にある第三になり、つまり、)は第二の場所は存在しないが、二つの最初の場所があります

DENSE_RANK()のためにオーバー注文 によって FSalary)AS DENSE_RANK、この機能を注文することがFSalaryによって昇順にソートされ、得られたソート結果のランキング番号。ことを除いてのrand()関数を使用してこの関数は、唯一のプラス1位タイのために結ばランク付けした後、(単に誰もが最初の場所のために結ば唯一のランク、2つの状況であると言う、この時間は、最初の2つになりました第二)は、二つの第一、第二、即ち、戻ってきます

NTILE(のため6注文 により FSalary)AS NTILE、これは昇順でソートするFSalaryによってソート機能、ソートの結果が得られたパケットの数です。

同様の並べ替えや集計ウィンドウ関数は、また、句OVER BY PARTITIONでステートメントをサポートしています。例えば:

コードをコピー
選択し  ます。FName、FSalary、FCity、FAge、   
ROW_NUMBER()の上に(パーティションによります。FNameの   順序 によって FSalary)としてROWNUM、   
ランク()の上に(パーティションによります。FNameの順序 によって FSalary)としてランク、   
DENSE_RANK()オーバー(パーティションによります。FNameの順序 によって FSalary )としてDENSE_RANK、   
NTILE(6(パーティションによります。FNameの順序 によって FSalary)としてNTILE 
 から  T_Personの 
 順序 によって   します。FName
コードをコピー

 PARTITION BY句については、上記の説明を参照してください、負担がなくなりました。しかし、注意すべき点は、PARTITION BY句を使用すると、ソートウィンドウ関数でORDER BY句の前に配置する必要があるということです。

これまでのところ、この論文の仕上げ。 

おすすめ

転載: blog.csdn.net/u011078141/article/details/91268197