Skip to content
Project: Evaluate a Manufacturing Process

Manufacturing processes for any product is like putting together a puzzle. Products are pieced together step by step, and keeping a close eye on the process is important.

For this project, you're supporting a team that wants to improve how they monitor and control a manufacturing process. The goal is to implement a more methodical approach known as statistical process control (SPC). SPC is an established strategy that uses data to determine whether the process works well. Processes are only adjusted if measurements fall outside of an acceptable range.

This acceptable range is defined by an upper control limit (UCL) and a lower control limit (LCL), the formulas for which are:

The UCL defines the highest acceptable height for the parts, while the LCL defines the lowest acceptable height for the parts. Ideally, parts should fall between the two limits.

Using SQL window functions and nested queries, you'll analyze historical manufacturing data to define this acceptable range and identify any points in the process that fall outside of the range and therefore require adjustments. This will ensure a smooth running manufacturing process consistently making high-quality products.

The data

The data is available in the manufacturing_parts table which has the following fields:

  • item_no: the item number
  • length: the length of the item made
  • width: the width of the item made
  • height: the height of the item made
  • operator: the operating machine
Spinner
DataFrameavailable as
alerts
variable
-- Write your query here


WITH temp AS (
			   SELECT
				item_no,
				operator,
				height,
				ROW_NUMBER() OVER (PARTITION BY operator ORDER BY item_no
								 ROWS BETWEEN 4 PRECEDING
								 AND CURRENT ROW) AS row_number,
				AVG(height) OVER (PARTITION BY operator ORDER BY item_no
								 ROWS BETWEEN 4 PRECEDING
								 AND CURRENT ROW) as avg_height,
				STDDEV(height) OVER (PARTITION BY operator ORDER BY item_no
								 ROWS BETWEEN 4 PRECEDING
								 AND CURRENT ROW) as stddev_height
			   FROM manufacturing_parts
			   ORDER BY item_no
			  ),

temp2 AS (
			SELECT
				item_no,
				operator,
				height,
				ROW_NUMBER() OVER (PARTITION BY operator ORDER BY item_no
								 ROWS BETWEEN 4 PRECEDING
								 AND CURRENT ROW) AS row_number,
				AVG(height) OVER (PARTITION BY operator ORDER BY item_no
								 ROWS BETWEEN 4 PRECEDING
								 AND CURRENT ROW) as avg_height,
				STDDEV(height) OVER (PARTITION BY operator ORDER BY item_no
								 ROWS BETWEEN 4 PRECEDING
								 AND CURRENT ROW) as stddev_height,
				avg_height + 3 * (stddev_height / SQRT(5)) as ucl,
				avg_height - 3 * (stddev_height / SQRT(5)) as lcl
			FROM temp
			)

SELECT
	temp.operator,
	temp.row_number,
	temp.height,
	temp.avg_height,
	temp.stddev_height,
	temp2.ucl,
	temp2.lcl,
	CASE WHEN temp.height > ucl OR temp.height < lcl THEN TRUE
	ELSE FALSE END AS alert
FROM temp
INNER JOIN temp2
ON temp.item_no = temp2.item_no
WHERE temp.row_number >= 5
ORDER BY temp.item_no;
Spinner
DataFrameavailable as
df
variable
-- Flag whether the height of a product is within the control limits
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 
			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;