如何在SQL中实现Excel的Pk/Cpk计算公式?
将Excel的Pk/Cpk计算公式转换为SQL实现
首先纠正你Excel公式的笔误:正确的Cpk计算公式应该是取(USL - 平均值)和(平均值 - LSL)中的较小值,再除以3*标准差,即:
=MIN(USL-mu, mu-LSL)/(3*sigma)
实现思路
因为mu(Length列平均值)和sigma(Length列标准差)是整个数据集的统计量,需要先计算这两个值,再结合USL、LSL计算Cpk。
方案1:为每行计算对应Cpk(适用于USL/LSL每行不同的场景)
使用CTE预先统计整体的平均值和标准差,再通过交叉关联到每一行计算Cpk:
WITH data_stats AS ( SELECT AVG(Tread_Length) AS mu, STDEV(Tread_Length) AS sigma FROM TL4_Cp_Cpk ) SELECT T.Tread_Length_LSL AS LSL, T.Tread_Length_USL AS USL, T.Tread_Length AS Length, -- 计算Cpk值 MIN(USL - ds.mu, ds.mu - LSL) / (3 * ds.sigma) AS Cpk FROM TL4_Cp_Cpk T CROSS JOIN data_stats ds;
方案2:计算全局整体Cpk(适用于USL/LSL为固定值的场景)
如果USL和LSL是全局统一的规格要求,可以直接在统计步骤中取出,一次性计算整体Cpk:
WITH data_stats AS ( SELECT AVG(Tread_Length) AS mu, STDEV(Tread_Length) AS sigma, MAX(Tread_Length_USL) AS USL, -- 假设USL为全局固定值 MAX(Tread_Length_LSL) AS LSL -- 假设LSL为全局固定值 FROM TL4_Cp_Cpk ) SELECT LSL, USL, mu AS Length_Average, sigma AS Length_Standard_Deviation, MIN(USL - mu, mu - LSL) / (3 * sigma) AS Cpk FROM data_stats;
注意事项
不同SQL方言的标准差函数可能有差异:
- SQL Server:
STDEV()(样本标准差)、STDEVP()(总体标准差) - MySQL:
STDDEV_SAMP()(样本)、STDDEV_POP()(总体) - PostgreSQL:
STDDEV_SAMP()(样本)、STDDEV_POP()(总体)
请根据你使用的数据库类型选择对应的函数。
内容的提问来源于stack exchange,提问作者Dustin Castleberry
相关产品推荐
相关产品推荐

