SQL OVER()句-いつ、なぜそれが役立つのですか?

簡単に言うと、Over句を使用して、集計値とともに非集計値を選択できます。

Partition BY、ORDER BY inside、ROWSまたはRANGEはOVER()by句の一部です。

partition byは、データをパーティション分割してから、これらのウィンドウ、集計関数を実行するために使用されます。パーティションを作成すると、結果セット全体が単一のパーティションと見なされます。

OVER句の基本構文を参照してください

PARTITION BY:データを分割し、同じデータを持つグループに対して操作を実行するために使用されます。

ORDER BY:パーティション内のデータの論理的な順序を定義するために使用されます。パーティションを指定しない場合、結果セット全体が単一のパーティションと見なされます

:これを使用して、操作の実行時にパーティションで考慮される行を指定できます。

例を見てみましょう:

これが私のデータセットです:

では、さまざまなシナリオを実行して、データがどのように影響を受けるかを見てみましょう。難しい構文から単純な構文になります。 1つ

sum_salの部分を確認してください。ここでは、Salaryによる順序を使用し、「境界のない前の行と現在の行の間の範囲」を使用しています。この場合、パーティションを使用していないため、データ全体が1つとして扱われます。パーティションを作成し、給与で注文しています。ここで重要なのは、無制限の前の行と現在の行です。これは、各行の開始行から現在の行までの合計を計算するときを意味します。ただし、給与が5000で名前のある行が表示された場合= “Pavan”、理想的には17000で、salary = 5000およびname = Markの場合、22000である必要があります。ただし、RANGEを使用しているため、この場合、sが見つかった場合同様の要素は、それらを同じ論理グループと見なし、それらに対して操作を実行して、そのグループ内の各アイテムに値を割り当てます。これが、salary = 5000の値が同じである理由です。エンジンはsalary = 5000およびName = Ronになり、合計を計算して、それをすべてのsalary = 5000に割り当てました。

したがって、無制限の前の行と現在の行の行の違いは、ではなく同じ値の項目の場合です。それらをグループ化すると、開始行から現在の行までSUMが計算され、「同じ値のアイテムをRANGEのように異なる方法で処理することはありません

これらの結果は

これは、Over(給与順)がOver(無制限の前の行と現在の行の間の給与範囲)のショートカットにすぎないためです。したがって、ROWSまたはRANGEなしでOrderbyを指定するだけです。デフォルトとして、バインドされていない前の行と現在の行の間の範囲。

注:これは、実際にRANGE / ROWを受け入れる関数にのみ適用されます。たとえば、ROW_NUMBERやその他のいくつかの関数は、RANGE / ROWを受け入れません。 、これは「思い浮かびません。

これまで、順序付きのOver句がRange / ROWSを使用していて、構文が少し見えていることがわかりましたバインドされていない前の行と現在の行の間のこの範囲のように、実際には最初の行から現在の行まで計算しています。しかし、データのパーティション全体の値を計算し、各列(つまり、最初の行から最後の行まで)に値を設定したい場合はどうでしょうか。これがそのクエリです

CURRENT ROWの代わりに、各行のパーティションの最後のレコードまで計算するようにエンジンに指示するUNBOUNDEDFOLLOWINGを指定しています。

これで空のブレースを使用したOVER()とは何ですか?

これはOverのショートカットです(無制限の前と無制限のフォローの間の給与行による順序)

ここでは間接的に指定していますすべての結果セットを単一のパーティションとして扱い、各パーティションの最初のレコードから最後のレコードまで計算を実行します。

これに関するビデオを作成しました。興味がある場合は、アクセスしてください。https://www.youtube.com/watch?v=CvVenuVUqto&t=1177s

ありがとう、Pavan Kumar AryasomayajuluHTTP://xyzcoder.github.io

Write a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です