-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoperator_alerts_stats.sql
More file actions
55 lines (55 loc) · 1.14 KB
/
operator_alerts_stats.sql
File metadata and controls
55 lines (55 loc) · 1.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
WITH alerts AS (
SELECT
b.*,
CASE WHEN b.height NOT BETWEEN b.lcl AND b.ucl
THEN TRUE
ELSE FALSE
END AS alert
FROM (
SELECT
a.*,
a.avg_height + 3*a.stddev_height/SQRT(5) AS ucl,
a.avg_height - 3*a.stddev_height/SQRT(5) AS lcl
FROM (
SELECT
item_no,
operator,
ROW_NUMBER() OVER w AS row_number,
height,
AVG(height) OVER w AS avg_height,
STDDEV(height) OVER w AS stddev_height
FROM manufacturing_parts
WINDOW w AS (
PARTITION BY operator
ORDER BY item_no
ROWS BETWEEN 4 PRECEDING AND CURRENT ROW
)
) AS a
WHERE a.row_number >= 5
) AS b
),
operator_alerts AS (
SELECT
operator,
COUNT(*) AS alert_count
FROM alerts
WHERE alert = TRUE
GROUP BY operator
),
alert_stats AS (
SELECT
operator,
alert_count,
SUM(alert_count) OVER() AS total_alerts,
alert_count / NULLIF(SUM(alert_count) OVER()::FLOAT, 0) AS alert_rate,
1 / (COUNT(operator) OVER())::FLOAT AS avg_alert_rate
FROM operator_alerts
)
SELECT
operator,
alert_count,
alert_rate,
avg_alert_rate,
alert_rate > avg_alert_rate AS above_average
FROM alert_stats
ORDER BY alert_count DESC;