OVER()
是 窗口函數(Window Function) 的核心語法,用于在 不改變行數 的情況下,對一組行(稱為“窗口”)進行聚合、排序或排名等操作。?函數名(列名) OVER (
[PARTITION BY 分組列]
[ORDER BY 排序列]
[ROWS/RANGE 滑動窗口范圍]
)
2. 常見用法示例
(1)聚合函數 + OVER()
計算每個部門的平均工資,同時保留每一行:
SELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM employees;
(2)排名函數 + OVER()
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
(3)滑動窗口計算
SELECT
date,
revenue,
AVG(revenue) OVER (
ORDER BY date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM sales;
ROWS
和 RANGE
是 窗口函數 中用來定義 “滑動窗口”范圍 的語法,告訴數據庫從哪一行到哪一行參與計算。ROWS是按物理行數(前N行、后N行),RANGE是按邏輯值范圍(前N個值、后N個值)。PRECEDING
是 窗口函數 中用來定義 “邊界從當前行往前數” 的關鍵詞,表示“往前多少行/值”。ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
的意思就是對每一行,取“它自己”加上“往前數 2 行”這一共 3 行的數據,用來做計算。
4. 常見窗口函數
5.計算OEE
這里舉一個關于按照班次對OEE計算的案例。
OEE(Overall Equipment Effectiveness,設備綜合效率) 是衡量 一臺設備真正有效生產時間 占 理論最大生產時間 的百分比。OEE = 實際的節拍時間 * (實際產出 - 在break down時間的產出) / 計劃工作時間
則按班次時聚合的代碼為
SELECT
equipment,
shift_date,
shift_id,
SUM(plan_min) OVER (
PARTITION BY equipment
ORDER BY shift_date, shift_id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cum_plan_min,
SUM(actual_output_qty - breakdown_output_loss_qty) OVER (
PARTITION BY equipment
ORDER BY shift_date, shift_id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cum_net_output,
actual_cycle_time_min,
actual_cycle_time_min
* cum_net_output
/ NULLIF(cum_plan_min, 0) AS rolling_oee
FROM shift_oee;
當然,在實際的工廠報表中,計算所考慮的東西比上述代碼多得多。
上述代碼把 計劃時間 和 凈產出 按時間順序累加,再乘上當前行節拍,即可在 每一班次 實時看到 滾動累計 OEE。
閱讀原文:原文鏈接
該文章在 2025/8/26 13:05:51 編輯過