SQL Serverでのウィンドウ関数(2012新機能)

簡単な紹介

    2013年以降のウィンドウ関数のためのSQL Serverが大幅に強化されましたが、多くの開発者のために、窓のための機能が不十分無駄になっているのは非常に強力なリード、理解されているので、この記事では、主にSQL Serverで話をしますウィンドウ関数の概念。

 

窓関数とは何ですか

    窓関数、また、OLAP分析機能または機能と呼ぶことができます。窓関数から理解機能が開始凝集よい理解、我々は、集約関数の概念を知っている、図1に示した凝集等合計、AVG、などのルール、単純な概念による単一線として複数行の列の値です。

1

【図集計関数

 

    したがって、一般的に言えば、重合後の行数は、重合前の行の数未満でなければなりません。窓関数のために、入力と出力結果と同じであるあなたは、コンピューティング製品および製品タイプB、サブクラス合計5、B 2サブサブクラス製品、窓関数を適用した結果を入力した場合、単純な例を挙げ7後の行は、依然として、窓関数は、カウントの後に適用されることができ、各ラインに取り付けられた、例えば「製品、サブクラス1,5」、次いで小さなクラスB「B品、サブカテゴリB 1、となります2「最後のものは、窓関数を適用した結果です。

    今、私たちは窓関数の予備的概観、私は出力ラインに等しい上記入力ラインに加えて、概念より深い、ウィンドウ関数を作るために窓関数のいくつかの具体的な例を提供します記事を持って、次の機能がありますし、メリット:

  • グループ別の同様の重合
  • 非順次データ・アクセス
  • 機能、ランキング機能や集計機能、解析ウィンドウ関数のために使用することができます
  • 簡素化SQLコード(除去が参加)
  • テーブルの真ん中を排除

    ウィンドウ関数は、全体のSQL文の一部であるウィンドウ関数がWhere句、HAVING、SQLクエリの結果セット上で実行されるため、グループ化を影響されないことを意味し、最後に実行されます。

    我々はリスト1に示すようなコードとして以下のSQL Server 2005のランク付け関数で使用される窓関数の典型的な例。

ROW_NUMBER()OVER(XXXのDESC BY XX ORDER BYパーティション)RowNumber関数

1.リストのソート機能は、ページネーションのために使用することができます

 

    リスト2に示すように、したがって、我々は、窓関数の構文のうち抽象化することができます。

列の別名AS(列1、列2、列3並び替え、窓のPARTITION BY句)オーバー機能()

2.構文窓関数リスト

 

簡単な例

    「ログイン名、性別、すべての従業員の性別総数、」IF:私たちは、たとえば、私は結果がある願って、セックスの重合によってAdventureWorksサンプルデータベースのEmployeeテーブルを言いたい場合のは、簡単な例を見てみましょう我々はそのようなリスト3に示すコードのようにサブクエリに関連する必要があり、伝統的な文言を使用しています。

[ログインID]、性別を選択して、
(SELECT COUNT a.Gender = b.Gender(*)[AdventureWorks2012] FROM [人事]。[社員] A)GenderTotal AS
  [AdventureWorks2012] [人事]。[社員] Bから

3.伝統的な文言リスト

 

    私たちは、窓関数を使用する場合、コードは瞬時に簡単になり、もはや図2に示すように、サブクエリに必要はありませんか参加。

2

図2の窓関数

 

    また、伝統的な文言に比べウィンドウ関数は、それは我々が、図3に示した実行計画を比較することで結論付けることができ、より優れた性能を持っています。

3

実行計画を比較することにより、図3、窓関数は、より良い性能を持って見ます

 

    私たちは、より複雑な例を考えてみた場合は、OVER句で使用すると、ウィンドウ関数を使用する場合、それはすべて、カーソル、循環およびその他の面倒な方法でなければなりませんあなたはウィンドウ関数を使用しない場合は、累積平均を完了するために、秩序を追加しました図4に示すような、非常に容易になります。

4

図4の窓関数

 

隔壁によって

    リスト2は言及以上の最初の句は、パーティションである後、シンタックスウィンドウの機能を示しています。句でパーティションは、データパケットである境界値に応じて、グループ別に非常に類似したクエリ・パーティション句、と呼ぶことができる、そしてパケットを超えた場合、関数は、パケットの各々の上前に実行し、関数の再計算は、例えば図2の例として、我々は、計算されたこれら二つのグループのカウント()関数の前に、二つの部分、雄および雌に(206人の男性、84人の女性)のデータを分割します。

   针对Partition By可以应用的函数不仅仅是我们所熟知的聚合函数,以及一些其他的函数,比如说Row_Number()。

 

Order By

    Order By子句是另一类子句,会让输入的数据强制排序(文章前面提到过,窗口函数是SQL语句最后执行的函数,因此可以把SQL结果集想象成输入数据)。Order By子句对于诸如Row_Number(),Lead(),LAG()等函数是必须的,因为如果数据无序,这些函数的结果就没有任何意义。因此如果有了Order By子句,则Count(),Min()等计算出来的结果就没有任何意义。

    下面我们看一个很有代表性的ROW_NUMBER()函数,该函数通常被用于分页,该函数从1开始不断递增,可以和Partition By一起使用,当穿越分区边界时,Row_Number重置为1,一个简单的例子如图5所示,我们根据请假小时数对员工进行排序。

5

图5.Row_Number函数示例

 

    另一个比较有趣的分析函数是LEAD()和LAG(),这两个分析函数经过Order By子句排序后,可以在当前行访问上N行(LAG)或下N行(LEAD)的数据,下面是一个例子,如图6所示。

6

图6.访问上一行的LAG函数

 

    另一个分析函数是RANK函数,与Row_Number不同的是,Rank函数中如果出现了相同的值,不会像Row_Number那样叠加计数,而是同样的值计数一样,比如说 1 1 3 4 5 5 7,而不是Row_Number的1 2 3 4 5 6 7。这里就不细说了。另外如果希望并列排名的不影响下一个排名,则考虑使用Dense_Rank函数。有关其他的诸如First_value和Last_Value之类的函数可以参看:http://technet.microsoft.com/zh-cn/library/hh213234.aspx

 

窗口子句

    スコープは、ウィンドウの前にテーブル全体、またはパーティション、パーティションの全体裏面の関数です。しかし、我々は(私が前に言ったように、窓関数が実行された最後の文全体で)データ・セットの窓関数の範囲をウィンドウ句制御入力を使用することができます。私は病気のすべてのレベルは人に任せるの会社を見つけたい場合はここでは、例から見始める、我々は、図7のステートメントで実行することができます。

7

図7は、ほとんどの人がそれぞれのレベルを残す見つけます

 

    しかし、我々は粒子サイズによって設定された入力データにしたい場合は、より微細なパーティションになり、我々は、我々は、ウィンドウ句を使用することができ、最初のN行と現在の行のN行の計算結果に応じてのみ、窓関数ように、ウィンドウ句を使用することができ後に、図8に示す、図8我々の並べ替えだけ3人の男性は、最前列の下で病人や現在の行の後ろの行と現在の行の中で最も長い時間を計算します。

8

三行で最も長いと人を見つけるための図8.休暇の時間

 

    我々はまた、図2に示すように使用され、例えば、我々は最初の行を検索したい、パーティションに指定された範囲の範囲を使用することができる。図9は、現在および前の行を使用します。

9

9。

 

概要

    窓関数からなる三つの部分から単に窓関数の概念を導入し、いくつかの例を示します。よりMSDN(を指すことができる、窓関数で使用されてもよいhttp://technet.microsoft.com/zh-cn/library/ms189461.aspx)。これらの機能を使用するだけでなく、バージョン要件を注意すると、多くの機能は、SQL Server 2012の中でのみサポートされていましたです。

おすすめ

転載: www.cnblogs.com/VicLiu/p/11792138.html