検索
ホームページデータベースSQLSQL のウィンドウ関数を 1 つの記事で理解する

この記事では、SQL サーバー に関する関連知識を提供します。分析関数とも呼ばれるウィンドウ関数には 2 種類あり、1 つは集計ウィンドウ関数、もう 1 つは並べ替えウィンドウ関数です。以下の記事では SQL のウィンドウ関数に関する関連情報を中心に、サンプルコードを通して詳しく紹介していますので、必要な方は参考にしてください。

SQL のウィンドウ関数を 1 つの記事で理解する

推奨学習: 「SQL チュートリアル

OVER の定義

OVER は行の定義に使用されます。値のセットを操作する Window は、データをグループ化するために GROUP BY 句を使用する必要がなく、同じ行内の基本行列と集計列の両方を返すことができます。

OVER 構文

OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )

グループ化のための PARTITION BY 句;

ORDER BY 句を使用して並べ替えます。

ウィンドウ関数 OVER() は行のセットを指定し、ウィンドウ関数はウィンドウ関数から出力された結果セット内の各行の値を計算します。

ウィンドウ関数は、GROUP BY を使用せずにデータをグループ化でき、ベース行の列と集計列を同時に返すこともできます。

OVER の使用法

OVER ウィンドウ関数は、集計関数または並べ替え関数と併用する必要があります。集計関数とは、一般に SUM()、MAX()、MIN、COUNT()、AVG( ) およびその他の一般的な関数。並べ替え関数は通常、RANK()、ROW_NUMBER()、DENSE_RANK()、NTILE() などを指します。

集計関数での OVER の使用例

デモのための例として、SUM 関数と COUNT 関数を使用します。

--建立测试表和测试数据
CREATE TABLE Employee
(
ID INT  PRIMARY KEY,
Name VARCHAR(20),
GroupName VARCHAR(20),
Salary INT
)
INSERT INTO  Employee
VALUES(1,'小明','开发部',8000),
      (4,'小张','开发部',7600),
      (5,'小白','开发部',7000),
      (8,'小王','财务部',5000),
      (9, null,'财务部',NULL),
      (15,'小刘','财务部',6000),
      (16,'小高','行政部',4500),
      (18,'小王','行政部',4000),
      (23,'小李','行政部',4500),
      (29,'小吴','行政部',4700);

SUM後のウィンドウ関数

SELECT *,
     SUM(Salary) OVER(PARTITION BY Groupname) 每个组的总工资,
     SUM(Salary) OVER(PARTITION BY groupname ORDER BY ID) 每个组的累计总工资,
     SUM(Salary) OVER(ORDER BY ID) 累计工资,
     SUM(Salary) OVER() 总工资
from Employee

(ヒント: コードを左右にスライドできます)

結果は次のとおりです:

各ウィンドウ関数の意味は異なります。詳しく説明しましょう:

SUM(Salary) OVER (PARTITION BY Groupname)

PARTITION BY のみ 次の列 Groupname がグループ化され、Salary の合計はグループ化後に計算されます。

SUM(給与) OVER (PARTITION BY Groupname ORDER BY ID)

PARTITION BY の後の Groupname 列の場合グループ化し、ORDER BY以降のIDでソートし、グループ内のSalaryを累計します。

SUM(給与) OVER (ORDER BY ID)

ORDER BY のみ 並べ替えソート後のID内容を取得し、ソートされたSalaryを集計します。

SUM(Salary) OVER ()

Salary の集計処理

After COUNTウィンドウ関数

SELECT *,
       COUNT(*) OVER(PARTITION BY Groupname ) 每个组的个数,
       COUNT(*) OVER(PARTITION BY Groupname ORDER BY ID) 每个组的累积个数,
       COUNT(*) OVER(ORDER BY ID) 累积个数 ,
       COUNT(*) OVER() 总个数
from Employee

によって返される結果は次のとおりです:

後続の各ウィンドウ関数は 1 つずつ解釈されなくなります。上記 SUM 以降のウィンドウ関数を 1 つずつ比較します。

ソート関数での OVER の使用例

4 つのソート関数を 1 つずつ説明します

--先建立测试表和测试数据
WITH t AS
(SELECT 1 StuID,'一班' ClassName,70 Score
UNION ALL
SELECT 2,'一班',85
UNION ALL
SELECT 3,'一班',85
UNION ALL
SELECT 4,'二班',80
UNION ALL
SELECT 5,'二班',74
UNION ALL
SELECT 6,'二班',80
)
SELECT * INTO Scores FROM t;
SELECT * FROM Scores

ROW_NUMBER()

定義 : ROW_NUMBER() 関数の機能は、SELECT でクエリされたデータを並べ替えることです。各データにはシリアル番号が追加されます。学生の成績のランク付けには使用できません。通常は、次のようなページング クエリに使用されます。上位 10 のクエリを 10 ~ 100 人の学生にクエリします。 ROW_NUMBER() は ORDER BY と一緒に使用する必要があります。そうしないと、エラーが報告されます。

学生のスコアを並べ替えます

SELECT *,
ROW_NUMBER() OVER (PARTITION BY ClassName ORDER BY SCORE DESC) 班内排序,
ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS 总排序
FROM Scores;

結果は次のとおりです:

ここでの PARTITION BY と ORDER BY の機能は次と同じです。上で見たこと 集計関数は同じ機能を持ち、グループ化と並べ替えに使用されます。

さらに、ROW_NUMBER() 関数は、指定された順序でデータを取得することもできます。

SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS 总排序
FROM Scores
) t WHERE t.总排序=2;

結果は次のとおりです:

RANK()

定義: RANK() 関数は、名前が示すように、特定のフィールドを順位付けできるランキング関数 ランキング、これとROW_NUMBER()の違いは何ですか? ROW_NUMBER()はソートです。同じ成績の生徒がいる場合、ROW_NUMBER()は順番にソートします。シリアル番号は異なりますが、Rank()は異なります。見た目が同じであれば、ランキングも同じです。以下の例を見てください:

Example

SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;
 
SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

結果:

#上の図は ROW_NUMBER です。 ( ) の場合、下図は RANK() の結果です。 2 人の生徒が同じ成績の場合、変化が生じます。 RANK() は 1-1-3-3-5-6 ですが、ROW_NUMBER() は 1-2-3-4-5-6 のままです。これが RANK() と ROW_NUMBER() の違いです。

DENSE_RANK() 

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?特别是对于有成绩相同的情况,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,一般情况下用的排名函数就是RANK() 我们看例子:

示例

SELECT 
RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;
 
SELECT 
DENSE_RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

结果如下:

上面是RANK()的结果,下面是DENSE_RANK()的结果

NTILE()

定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的'分区'一样 ,分为几个区,一个区会有多少个。  

SELECT *,NTILE(1) OVER (ORDER BY SCORE DESC) AS 分区后排序 FROM Scores;
SELECT *,NTILE(2) OVER (ORDER BY SCORE DESC) AS 分区后排序 FROM Scores;
SELECT *,NTILE(3) OVER (ORDER BY SCORE DESC) AS 分区后排序 FROM Scores;

结果如下:

就是将查询出来的记录根据NTILE函数里的参数进行平分分区。

总结

OVER开窗函数是我们工作中经常要使用到的,特别是在做数据分析计算的时候,经常要对数据进行分组排序。上面我们额外介绍了聚合函数和排序函数的与OVER结合的使用方法,此外还有很多与OVER一起使用的函数,比如LEAD函数,LAG函数,STRING_AGG函数等等都会使用到开窗函数OVER,其使用方法也要务必掌握。

推荐学习:《SQL教程

以上がSQL のウィンドウ関数を 1 つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は脚本之家で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
SQLおよびMySQL:コアの違いを理解しますSQLおよびMySQL:コアの違いを理解しますApr 17, 2025 am 12:03 AM

SQLはリレーショナルデータベースを管理するための標準言語であり、MySQLは特定のデータベース管理システムです。 SQLは統一された構文を提供し、さまざまなデータベースに適しています。 MySQLは軽量でオープンソースで、パフォーマンスは安定していますが、ビッグデータ処理にはボトルネックがあります。

SQL:初心者向けの学習曲線SQL:初心者向けの学習曲線Apr 16, 2025 am 12:11 AM

SQL学習曲線は急ですが、練習とコアの概念を理解することで習得できます。 1.基本操作には、選択、挿入、更新、削除が含まれます。 2。クエリの実行は、分析、最適化、実行の3つのステップに分けられます。 3.基本的な使用法は、従業員情報の照会など、Join Connection Tableの使用などです。 4.一般的なエラーには、エイリアスとSQLインジェクションの使用が含まれないことが含まれ、それを防ぐためにパラメーター化されたクエリが必要です。 5.パフォーマンスの最適化は、必要な列を選択し、コードの読みやすさを維持することにより達成されます。

SQL:コマンド、mysql:エンジンSQL:コマンド、mysql:エンジンApr 15, 2025 am 12:04 AM

SQLコマンドは、DQL、DDL、DML、DCL、TCLのMySQLの5つのカテゴリに分割され、データベースデータの定義、操作、制御に使用されます。 MySQLは、語彙分析、構文分析、最適化、実行を通じてSQLコマンドを処理し、インデックスとクエリオプティマイザーを使用してパフォーマンスを向上させます。使用法の例には、データクエリの選択を選択し、マルチテーブル操作に参加します。一般的なエラーには、構文、ロジック、パフォーマンスの問題、および最適化戦略には、インデックスの使用、クエリの最適化、適切なストレージエンジンの選択が含まれます。

データ分析のためのSQL:ビジネスインテリジェンスの高度な手法データ分析のためのSQL:ビジネスインテリジェンスの高度な手法Apr 14, 2025 am 12:02 AM

SQLの高度なクエリスキルには、複雑なデータ分析要件を処理できるサブクエリ、ウィンドウ関数、CTE、複雑な結合が含まれます。 1)サブクエリは、各部門で最高の給与を持つ従業員を見つけるために使用されます。 2)ウィンドウ関数とCTEを使用して、従業員の給与成長傾向を分析します。 3)パフォーマンス最適化戦略には、インデックスの最適化、クエリの書き換え、パーティションテーブルの使用が含まれます。

MySQL:SQLの特定の実装MySQL:SQLの特定の実装Apr 13, 2025 am 12:02 AM

MySQLは、標準のSQL関数と拡張機能を提供するオープンソースリレーショナルデータベース管理システムです。 1)MySQLは、制限句の作成、挿入、更新、削除、拡張などの標準のSQL操作をサポートしています。 2)InnodbやMyisamなどのストレージエンジンを使用しています。これらは、さまざまなシナリオに適しています。 3)ユーザーは、テーブルの作成、データの挿入、ストアドプロシージャの使用など、高度な機能を介してMySQLを効率的に使用できます。

SQL:すべての人がデータ管理にアクセスできるようにしますSQL:すべての人がデータ管理にアクセスできるようにしますApr 12, 2025 am 12:14 AM

sqlmakesdatamanagemagementisibletoallbyproviding asimpleyetpowerfultoolset andmanagingdatabases.1)itworks withersortifyify what what what what what what what what whatysortsopecifyifyを許可します

SQLインデックス戦略:クエリパフォーマンスを桁違いに改善するSQLインデックス戦略:クエリパフォーマンスを桁違いに改善するApr 11, 2025 am 12:04 AM

SQLインデックスは、巧妙なデザインを通じてクエリパフォーマンスを大幅に改善できます。 1. Bツリー、ハッシュ、フルテキストインデックスなどの適切なインデックスタイプを選択します。 2。複合インデックスを使用して、マルチフィールドクエリを最適化します。 3.オーバーインデックスを避けて、データメンテナンスのオーバーヘッドを減らします。 4.不要なインデックスの再構築や削除など、定期的にインデックスを維持します。

SQLで制約を削除する方法SQLで制約を削除する方法Apr 10, 2025 pm 12:21 PM

SQLの制約を削除するには、次の手順を実行します。削除する制約名を特定します。 ALTER TABLEステートメントを使用してください:Table Table Name Drop Constraint Constraint Nameを変更します。削除を確認します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター