MSSQL Over (Partition by ... Order by ...) 範例
建立Table
CREATE TABLE sales (
department VARCHAR(50),
employee VARCHAR(50),
sale_date DATE,
amount DECIMAL(10, 2)
);
INSERT INTO sales VALUES
('部門A', '員工1', '2023-01-01', 100.00),
('部門A', '員工1', '2023-01-02', 150.00),
('部門A', '員工2', '2023-01-01', 200.00),
('部門B', '員工3', '2023-01-01', 50.00),
('部門B', '員工3', '2023-01-02', 75.00),
('部門B', '員工4', '2023-01-01', 300.00);
資料結構:
| department | employee | sale_date | amount |
|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 100 |
| 部門A | 員工1 | 2023/1/2 | 150 |
| 部門A | 員工2 | 2023/1/1 | 200 |
| 部門B | 員工3 | 2023/1/1 | 50 |
| 部門B | 員工3 | 2023/1/2 | 75 |
| 部門B | 員工4 | 2023/1/1 | 300 |
在分區中計算行號:
SELECT
department,
employee,
sale_date,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale_date) AS row_num
FROM
sales;
資料結果:
| department | employee | sale_date | row_num |
|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 1 |
| 部門A | 員工2 | 2023/1/1 | 2 |
| 部門A | 員工1 | 2023/1/2 | 3 |
| 部門B | 員工3 | 2023/1/1 | 1 |
| 部門B | 員工4 | 2023/1/1 | 2 |
| 部門B | 員工3 | 2023/1/2 | 3 |
在分區中計算排名:
SELECT
department,
employee,
sale_date,
RANK() OVER (PARTITION BY department ORDER BY sale_date) AS rank
FROM
sales
資料結果:
| department | employee | sale_date | rank |
|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 1 |
| 部門A | 員工2 | 2023/1/1 | 1 |
| 部門A | 員工1 | 2023/1/2 | 3 |
| 部門B | 員工3 | 2023/1/1 | 1 |
| 部門B | 員工4 | 2023/1/1 | 1 |
| 部門B | 員工3 | 2023/1/2 | 3 |
在分區中計算累積總和:
SELECT
department,
employee,
sale_date,
amount,
SUM(amount) OVER (PARTITION BY department, employee ORDER BY sale_date) AS cumulative_amount
FROM
sales;
資料結果:
| department | employee | sale_date | amount | cumulative_amount |
|---|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 100 | 100 |
| 部門A | 員工1 | 2023/1/2 | 150 | 250 |
| 部門A | 員工2 | 2023/1/1 | 200 | 200 |
| 部門B | 員工3 | 2023/1/1 | 50 | 50 |
| 部門B | 員工3 | 2023/1/2 | 75 | 125 |
| 部門B | 員工4 | 2023/1/1 | 300 | 300 |
在分區中計算平均薪水:
SELECT
department,
employee,
sale_date,
amount,
AVG(amount) OVER (PARTITION BY department) AS avg_amount
FROM
sales;
資料結果:
| department | employee | sale_date | amount | avg_amount |
|---|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 100 | 150 |
| 部門A | 員工1 | 2023/1/2 | 150 | 1900/5/29 |
| 部門A | 員工2 | 2023/1/1 | 200 | 1900/5/29 |
| 部門B | 員工3 | 2023/1/1 | 50 | 1900/5/20 |
| 部門B | 員工3 | 2023/1/2 | 75 | 1900/5/20 |
| 部門B | 員工4 | 2023/1/1 | 300 | 1900/5/20 |
在分區中計算百分位數:
SELECT
department,
employee,
sale_date,
amount,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) OVER (PARTITION BY department) AS median_amount
FROM
sales;
資料結果:
| department | employee | sale_date | amount | median_amount |
|---|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 100 | 150 |
| 部門A | 員工1 | 2023/1/2 | 150 | 150 |
| 部門A | 員工2 | 2023/1/1 | 200 | 150 |
| 部門B | 員工3 | 2023/1/1 | 50 | 75 |
| 部門B | 員工3 | 2023/1/2 | 75 | 75 |
| 部門B | 員工4 | 2023/1/1 | 300 | 75 |
在分區中計算前後數值:
SELECT
department,
employee,
sale_date,
amount,
LEAD(amount) OVER (PARTITION BY department, employee ORDER BY sale_date) AS next_amount,
LAG(amount) OVER (PARTITION BY department, employee ORDER BY sale_date) AS prev_amount
FROM
sales;
資料結果:
| department | employee | sale_date | amount | next_amount | prev_amount |
|---|---|---|---|---|---|
| 部門A | 員工1 | 2023/1/1 | 100 | 150 | NULL |
| 部門A | 員工1 | 2023/1/2 | 150 | NULL | 100 |
| 部門A | 員工2 | 2023/1/1 | 200 | NULL | NULL |
| 部門B | 員工3 | 2023/1/1 | 50 | 75 | NULL |
| 部門B | 員工3 | 2023/1/2 | 75 | NULL | 50 |
| 部門B | 員工4 | 2023/1/1 | 300 | NULL | NULL |
留言
張貼留言