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