group byとoverの違い(partition by)

1>テーブルを作成してデータを挿入します。これoverはウィンドウ関数であるため、ウィンドウ関数をmysqlサポートしいません。oracle,sql server,db2...また、他の新しいバージョンもサポートされています(ここでは他のユーザーからデータを借用しています)。

CREATE TABLE Employee
(
  ID number(10) not null primary key,
  EmpName varchar(20),
  EmpSalary varchar(10),
  EmpDepartment varchar(20)
);
 
insert all into Employee values(1,'张三','5000','开发部')
into Employee values(2,'李四','2000','销售部')
into Employee values(3,'王麻子','2500','销售部')
into Employee values(4,'张三表叔','8000','开发部')
into Employee values(5,'李四表叔','5000','开发部')
into Employee values(6,'王麻子表叔','5000','销售部')
select 1 from dual

2>各部門の総給与を計算しますか?

2.1>group by

SELECT EmpDepartment,SUM(EmpSalary) sum_sala FROM Employee GROUP BY EmpDepartment

ここに画像の説明を挿入
2.2>over(partition by)

SELECT EmpSalary,EmpDepartment,SUM(EmpSalary) OVER(PARTITION BY EmpDepartment) sum_sala FROM Employee

ここに画像の説明を挿入

ここで要約:group byおよびpartition byはグループ化された統計関数ですが、要約関数partition bygroup byありませんpartition by統計のgroup byすべてのレコードが存在し、すべてのレコードが1つのレコードに要約されます(distinct EmpDepartment重複排除と同様)。partition by集計関数と組み合わせて使用​​でき、その他の高度な機能があります。

3>partition by後に追加order by

SELECT EmpSalary,EmpDepartment,SUM(EmpSalary) OVER(PARTITION BY EmpDepartment ORDER BY EmpSalary) sum_sala FROM Employee

ここに画像の説明を挿入

ここでは概要は次のとおりです。追加した後order by、蓄積機能(に類似sum_sala += EmpSalary)、第1〜第4のレコードから始まる、営業部門の結果を観察しsum(EmpSalary)ているsum_sala=20005番目のレコード、sum(EmpSalary)=sum_sala+2500=4500であるの合計第四sum_salaおよび第五は、EmpSalary順番に、類推;開発部門では、2つの5000が並列であるため、計算時にいくつかの並列データの合計は5000 + 5000 = 10000になります。


窓関数はover ( partition by)うまく機能しgroup by差別化されています

1.over関数の書き方:

overpartition by class order by sroce)

sroceソートに従って累積order byします。これは、classパーティションに応じたデフォルトのウィンドウ関数です

2.ウィンドウを開くウィンドウスコープ:

 overorder by sroce range between 5 preceding and 5 following

ウィンドウ範囲は、現在の行データの振幅から5プラス5を引いた範囲内です。

 overorder by sroce rows between 5 preceding and 5 following

ウィンドウ範囲は、現在の行の前後5行です。

 sum() over(partition byorder by):求分组后的总和。 
 first_value() over(partition byorder by):求分组后的第一个。 
 last_value() over(partition byorder by):求分组后的最后一个。 
 count() over(partition byorder by):求分组后的总数。 
 max() over(partition byorder by):求分组后的最大值。 
 min() over(partition byorder by):求分组后的最小值。 
 avg() over(partition byorder by):求分组后的平均值。 
 lag() over(partition byorder by):取出前n行数据。   
 lead() over(partition byorder by):取出后n行数据。

3.違いover partition bygroup by

元のテーブル:

NAME     DEPT    SALARY
A         10     1000
B         10     2000
C         20     1500
D         20     3000
E         10     1000   

これによりover partition by、各従業員の元の特定の情報とその部門の総給与を照会できます。

select name,dept,salary,sum(salary) over (partition by dept) total_salary from salary;  
name     dept      salary      tatal_salary
A        10        1000        4000
B        10        2000        4000
E        10        1000        4000
C        20        1500        4500
D        20        3000        4500

を使用goup byしてこれを行う方法はありません。各部門の合計給与のみを照会できます

select dept,sum(salary) total_salary from salary group by dept
dept      total_salary
10        4000
20        4500

over partition by各データの詳細
group byが表示され集計には複数のアイテムが表示されます。集計には1つのアイテムのみが表示されます。


over partition bygroup by区別

group byグループ化された統計データのみを取得over partition byでき、グループ化された統計データを取得できるだけなく、詳細データを同時に表示することもできます。
group byではwhere次の句;over partition byそれはあるfrom句の前に。

over partition byそしてgroup by、統計のような関数で使用されますが、これら2つにはどのような違いがありますか?
現在、私はそのような違いを1つだけ知っています。たとえば
、テーブルがありますsaraly

CREATE TABLE SALARY AS 
SELECT 'A' NAME,10 DEPT,1000 SALARY FROM DUAL 
UNION ALL 
SELECT 'B',10,2000 FROM DUAL 
UNION ALL 
SELECT 'C' ,20,1500 FROM DUAL 
UNION ALL 
SELECT 'D',20,3000 FROM DUAL 
UNION ALL
SELECT 'E',10,1000 FROM DUAL;
NAME DEPT SALARY
A         10     1000
B         10     2000
C         20     1500
D         20     3000
E         10     1000  

これによりover partition by、各従業員の元の特定の情報とその部門の総給与を照会できます。

select name,dept,salary,sum(salary) over (partition by dept) total_salary from salary; 
name       dept         salary      tatal_salary
A        10        1000        4000
B        10        2000        4000
E        10        1000        4000
C        20        1500        4500
D        20        3000        4500

を使用goup byしてこれを行う方法はありません。各部門の合計給与のみを照会できます

select dept,sum(salary) total_salary from salary group by dept
dept        total_salary
10        4000
20        4500

さらにover partition by、部門の総給与に占める各従業員の割合を照会することもできます。

select name,dept,salary,salary*100/sum(salary) over (partition by dept) percent from salary;
name       dept         salary     percent
A        10        1000        25
B        10        2000        50
E        10        1000        25
C        20        1500        33.3333333333333
D        20        3000        66.6666666666667

これgroup byを行う方法がありません。私の理解が正しくないことはわかりません。友達にアドバイスしてください。特にover partition bygroup byより差別化されたものを共有してください。ありがとうございます。

おすすめ

転載: blog.csdn.net/WuLex/article/details/115037696