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);

資料結構:

departmentemployeesale_dateamount
部門A員工12023/1/1100
部門A員工12023/1/2150
部門A員工22023/1/1200
部門B員工32023/1/150
部門B員工32023/1/275
部門B員工42023/1/1300

 

在分區中計算行號:

SELECT
    department,
    employee,
    sale_date,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale_date) AS row_num
FROM
    sales;

資料結果:

departmentemployeesale_daterow_num
部門A員工12023/1/11
部門A員工22023/1/12
部門A員工12023/1/23
部門B員工32023/1/11
部門B員工42023/1/12
部門B員工32023/1/23

 

在分區中計算排名:

SELECT
    department,
    employee,
    sale_date,
    RANK() OVER (PARTITION BY department ORDER BY sale_date) AS rank
FROM
    sales

資料結果:

departmentemployeesale_daterank
部門A員工12023/1/11
部門A員工22023/1/11
部門A員工12023/1/23
部門B員工32023/1/11
部門B員工42023/1/11
部門B員工32023/1/23

 

在分區中計算累積總和:

SELECT
    department,
    employee,
    sale_date,
    amount,
    SUM(amount) OVER (PARTITION BY department, employee ORDER BY sale_date) AS cumulative_amount
FROM
    sales;

資料結果:

departmentemployeesale_dateamountcumulative_amount
部門A員工12023/1/1100100
部門A員工12023/1/2150250
部門A員工22023/1/1200200
部門B員工32023/1/15050
部門B員工32023/1/275125
部門B員工42023/1/1300300

 

在分區中計算平均薪水:

SELECT
    department,
    employee,
    sale_date,
    amount,
    AVG(amount) OVER (PARTITION BY department) AS avg_amount
FROM
    sales;

資料結果:

departmentemployeesale_dateamountavg_amount
部門A員工12023/1/1100150
部門A員工12023/1/21501900/5/29
部門A員工22023/1/12001900/5/29
部門B員工32023/1/1501900/5/20
部門B員工32023/1/2751900/5/20
部門B員工42023/1/13001900/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;

資料結果:

departmentemployeesale_dateamountmedian_amount
部門A員工12023/1/1100150
部門A員工12023/1/2150150
部門A員工22023/1/1200150
部門B員工32023/1/15075
部門B員工32023/1/27575
部門B員工42023/1/130075

 

在分區中計算前後數值:

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;

資料結果:

departmentemployeesale_dateamountnext_amountprev_amount
部門A員工12023/1/1100150NULL
部門A員工12023/1/2150NULL100
部門A員工22023/1/1200NULLNULL
部門B員工32023/1/15075NULL
部門B員工32023/1/275NULL50
部門B員工42023/1/1300NULLNULL

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記