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 by
はgroup 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=2000
5番目のレコード、sum(EmpSalary)=sum_sala+2500=4500
であるの合計第四sum_sala
および第五は、EmpSalary
順番に、類推;開発部門では、2つの5000が並列であるため、計算時にいくつかの並列データの合計は5000 + 5000 = 10000になります。
窓関数はover ( partition by)
うまく機能し、group by
差別化されています
1.over
関数の書き方:
over(partition by class order by sroce)
sroce
ソートに従って累積order by
します。これは、class
パーティションに応じたデフォルトのウィンドウ関数です。
2.ウィンドウを開くウィンドウスコープ:
over(order by sroce range between 5 preceding and 5 following)
ウィンドウ範囲は、現在の行データの振幅から5プラス5を引いた範囲内です。
over(order by sroce rows between 5 preceding and 5 following)
ウィンドウ範囲は、現在の行の前後5行です。
sum() over(partition by … order by …):求分组后的总和。
first_value() over(partition by … order by …):求分组后的第一个。
last_value() over(partition by … order by …):求分组后的最后一个。
count() over(partition by … order by …):求分组后的总数。
max() over(partition by … order by …):求分组后的最大值。
min() over(partition by … order by …):求分组后的最小值。
avg() over(partition by … order by …):求分组后的平均值。
lag() over(partition by … order by …):取出前n行数据。
lead() over(partition by … order by …):取出后n行数据。
3.違いover partition by
group 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 by
group 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 by
、group by
より差別化されたものを共有してください。ありがとうございます。