首页 > 数据库 >SQL进阶技巧:如何根据工业制程参数计算良品率?

SQL进阶技巧:如何根据工业制程参数计算良品率?

时间:2024-12-16 22:01:26浏览次数:5  
标签:良品率 product 制程 production 参数 SQL id quantity

目录

0 问题描述

1 数据准备

2 问题分析

步骤1:确定每个生产批次的制程参数是否在合格范围内

步骤2:基于中间结果一计算临时良品数量

步骤3:计算良品率(最终结果)

3 小结

问题拓展:如果制程参数是动态的,如何合理的设计表模型? 


0 问题描述

  • 制程参数是在产品生产过程中影响产品质量的各种因素,如温度、压力、时间、原材料成分等。要根据这些制程参数来计算良品率,需要考虑制程参数与产品是否合格之间的关系。通常,需要先确定每个制程参数的合格范围,然后统计在合格制程参数下生产出的良品数量与总生产数量的比率。

1 数据准备

  • 生产数据表(production_data)
    • 包含production_id(生产批次 ID)、product_id(产品 ID)、production_date(生产日期)、quantity_produced(生产数量)、quantity_defective(次品数量)、process_temperature(生产温度)、process_pressure(生产压力)等制程参数字段。
       CREATE TABLE production_data (
           production_id INT PRIMARY KEY,
           product_id INT,
           production_date DATE,
           quantity_produced INT,
           quantity_defective INT,
           process_temperature DECIMAL(5,2),
           process_pressure DECIMAL(5,2)
       );
       INSERT INTO production_data VALUES
       (1, 1, '2024-01-01', 1000, 50, 100.00, 2.00),
       (2, 1, '2024-02-01', 1200, 80, 105.00, 2.20),
       (3, 2, '2024-01-15', 800, 40, 98.00, 1.80),
       (4, 2, '2024-02-15', 900, 60, 102.00, 2.10);
  • 制程参数标准表(process_standards)
    • 包含product_id(产品 ID)、parameter_name(参数名称,如 'temperature'、'pressure')、lower_limit(参数下限)、upper_limit(参数上限)。
       CREATE TABLE process_standards (
           product_id INT,
           parameter_name VARCHAR(20),
           lower_limit DECIMAL(5,2),
           upper_limit DECIMAL(5,2)
       );
       INSERT INTO process_standards VALUES
       (1, 'temperature', 95.00, 105.00),
       (1, 'pressure', 1.80, 2.20),
       (2, 'temperature', 90.00, 102.00),
       (2, 'pressure', 1.60, 2.00);

2 问题分析

步骤1:确定每个生产批次的制程参数是否在合格范围内

  • 通过将生产数据表和制程参数标准表进行连接,使用CASE WHEN语句判断每个生产批次的制程参数是否在合格范围内。
     SELECT 
         pd.production_id,
         pd.product_id,
         pd.production_date,
         pd.quantity_produced,
         pd.quantity_defective,
         -- 判断温度是否在合格范围内
         CASE WHEN ps_t.lower_limit <= pd.process_temperature AND pd.process_temperature <= ps_t.upper_limit 
              THEN 1 ELSE 0 END AS temperature_in_range,
         -- 判断压力是否在合格范围内
         CASE WHEN ps_p.lower_limit <= pd.process_pressure AND pd.process_pressure <= ps_p.upper_limit 
              THEN 1 ELSE 0 END AS pressure_in_range
     FROM production_data pd
     -- 连接温度标准表
     JOIN process_standards ps_t ON pd.product_id = ps_t.product_id AND ps_t.parameter_name = 'temperature'
     -- 连接压力标准表
     JOIN process_standards ps_p ON pd.product_id = ps_p.product_id AND ps_p.parameter_name = 'pressure';
production_idproduct_idproduction_datequantity_producedquantity_defectivetemperature_in_rangepressure_in_range
112024-01-0110005011
212024-02-0112008011
322024-01-158004011
422024-02-159006011

在这个结果集中,我们可以清晰看到每个生产批次对应的产品 ID、生产日期、生产数量、次品数量以及温度和压力这两个制程参数是否在各自的合格范围内(1表示在合格范围内,0表示不在合格范围内)。这一步的中间结果为后续计算良品率提供了基础数据,明确了哪些批次的哪些制程参数是符合标准的。

步骤2:基于中间结果一计算临时良品数量

  • 基于上一步的中间结果,进一步计算在考虑当前制程参数合格情况时,每个生产批次对应的临时良品数量(即如果制程参数都合格,该批次的良品数量;若有参数不合格,则临时良品数量计为 0)。
-- 步骤二:基于制程参数合格情况计算临时良品数量并输出中间结果
SELECT 
    production_id,
    product_id,
    production_date,
    quantity_produced,
    quantity_defective,
    temperature_in_range,
    pressure_in_range,
    -- 计算临时良品数量(考虑制程参数合格情况)
    CASE WHEN temperature_in_range = 1 AND pressure_in_range = 1 
         THEN quantity_produced - quantity_defective 
         ELSE 0 END AS temp_good_quantity
FROM (
    SELECT 
        pd.production_id,
        pd.product_id,
        pd.production_date,
        pd.quantity_produced,
        pd.quantity_defective,
        -- 判断温度是否在合格范围内
        CASE WHEN ps_t.lower_limit <= pd.process_temperature AND pd.process_temperature <= ps_t.upper_limit 
             THEN 1 ELSE 0 END AS temperature_in_range,
        -- 判断压力是否在合格范围内
        CASE WHEN ps_p.lower_limit <= pd.process_pressure AND pd.process_pressure <= ps_p.upper_limit 
             THEN 1 ELSE 0 END AS pressure_in_range
    FROM production_data pd
    -- 关联温度标准数据
    JOIN process_standards ps_t ON pd.product_id = ps_t.product_id AND ps_t.parameter_name = 'temperature'
    -- 关联压力标准数据
    JOIN process_standards ps_p ON pd.product_id = ps_p.product_id AND ps_p.parameter_name = 'pressure'
) subquery;
     GROUP BY product_id, production_date;
production_idproduct_idproduction_datequantity_producedquantity_defectivetemperature_in_rangepressure_in_rangetemp_good_quantity
112024-01-0110005011950
212024-02-01120080111120
322024-01-158004011760
422024-02-159006011840

这里新增了temp_good_quantity字段,表示在考虑当前制程参数(温度和压力)合格与否的情况下,每个生产批次对应的临时良品数量。如果温度和压力都在合格范围内,该字段的值就是该批次实际的良品数量(生产数量减去次品数量);若有一个或多个制程参数不在合格范围内,则该字段值为 0。这个中间结果更接近最终计算良品率所需的数据形式,为下一步汇总计算良品率做准备。:

步骤3:计算良品率(最终结果)

-- 步骤三:计算良品率并输出最终结果
SELECT 
    product_id,
    production_date,
    CONCAT(ROUND(((SUM(temp_good_quantity)) / SUM(quantity_produced)) * 100, 2), '%') AS yield_rate
FROM (
    SELECT 
        production_id,
        product_id,
        production_date,
        quantity_produced,
        quantity_defective,
        temperature_in_range,
        pressure_in_range,
        -- 计算临时良品数量(考虑制程参数合格情况)
        CASE WHEN temperature_in_range = 1 AND pressure_in_range = 1 
             THEN quantity_produced - quantity_defective 
             ELSE 0 END AS temp_good_quantity
    FROM (
        SELECT 
            pd.production_id,
            pd.product_id,
            pd.production_date,
            pd.quantity_produced,
            pd.quantity_defective,
            -- 判断温度是否在合格范围内
            CASE WHEN ps_t.lower_limit <= pd.process_temperature AND pd.process_temperature <= ps_t.upper_limit 
                 THEN 1 ELSE 0 END AS temperature_in_range,
            -- 判断压力是否在合格范围内
            CASE WHEN ps_p.lower_limit <= pd.process_pressure AND pd.process_pressure <= ps_p.upper_limit 
                 THEN 1 ELSE 0 END AS pressure_in_range
        FROM production_data pd
        -- 关联温度标准数据
        JOIN process_standards ps_t ON pd.product_id = ps_t.product_id AND ps_t.parameter_name = 'temperature'
        -- 关联压力标准数据
        JOIN process_standards ps_p ON pd.product_id = ps_p.product_id AND ps_p.parameter_name = 'pressure'
    ) subquery
) final_subquery
GROUP BY product_id, production_date;

最终结果展示

product_idproduction_dateyield_rate
12024-01-0195.00%
12024-02-0193.33%
22024-01-1595.00%
22024-02-1593.33%

最终结果呈现了每个产品在不同生产日期下的良品率情况,通过展示中间结果,我们可以更清晰地理解整个从原始生产数据和制程参数标准,逐步计算到最终良品率的完整过程,方便排查数据和计算逻辑上可能出现的问题,同时也有助于根据业务需求对计算过程进行灵活调整(比如增加更多制程参数的判断等)。

3 小结

如果有更多的制程参数,需要按照类似的方式添加更多的连接和判断条件来确定每个参数是否在合格范围内,并且在计算良品率时也需要考虑所有参数都合格的情况。同时,这种方法可以根据实际业务需求进行调整,例如,如果某些制程参数的权重不同,可以在计算良品率时引入权重因素。

问题拓展:如果制程参数是动态的,如何合理的设计表模型? 

  • 参数定义表(Parameter Definition Table)

  • 目的:用于存储制程参数的基本定义信息,包括参数名称、参数类型、单位等,这些信息相对稳定,不会随着具体生产批次而频繁变化。
  • 结构示例
    Column NameData TypeDescription
    parameter_idInteger制程参数的唯一标识符
    parameter_nameVARCHAR制程参数的名称(如温度、压力等)
    parameter_typeVARCHAR参数的数据类型(如数值型、字符型等)
    unitVARCHAR参数的单位(如摄氏度、帕斯卡等)
  • 用途说明
    • 当有新的制程参数加入时,只需在这个表中添加新的记录,为后续关联其他表提供基础信息。例如,如果新增一个 “湿度” 制程参数,就可以插入一条记录(如parameter_id = 3parameter_name = 'humidity'parameter_type = 'numeric'unit = '%')。

参数标准表(Parameter Standards Table)

  • 目的:存储每个产品对于不同制程参数的合格标准,这是一个动态变化的部分,因为产品的制程标准可能会根据质量要求、工艺改进等因素而改变。
  • 结构示例
    Column NameData TypeDescription
    product_idInteger产品的唯一标识符
    parameter_idInteger制程参数的唯一标识符(关联参数定义表)
    lower_limitDECIMAL(或其他合适类型)制程参数合格范围的下限
    upper_limitDECIMAL(或其他合适类型)制程参数合格范围的上限
  • 用途说明
    • 通过product_idparameter_id的组合,可以灵活地为每个产品定义不同制程参数的合格标准。当制程标准发生变化时,只需更新这个表中的相应记录。例如,如果产品 1 的温度合格范围从95 - 105调整为90 - 100,就可以在这个表中更新对应的记录。
    • 这种设计方便了对不同产品和不同制程参数标准的管理,同时可以通过关联parameter_id与参数定义表,获取完整的参数信息。

生产数据表(Production Data Table)

  • 目的:记录实际生产过程中的详细数据,包括生产批次信息、产品信息、生产数量、次品数量以及实际的制程参数值。
  • 结构示例(包含部分字段)
    Column NameData TypeDescription
    production_idInteger生产批次的唯一标识符
    product_idInteger产品的唯一标识符(关联产品表)
    production_dateDATE生产日期
    quantity_producedInteger生产数量
    quantity_defectiveInteger次品数量
    parameter_value_1DECIMAL(或其他合适类型)第一个制程参数的实际值(关联参数定义表)
    parameter_value_2DECIMAL(或其他合适类型)第二个制程参数的实际值(关联参数定义表)
    .........
  • 用途说明
    • 生产数据表存储了实际生产中的动态数据,其中制程参数的值可以根据生产过程中的实际测量而记录。在设计时,可以根据实际的制程参数数量预留足够的字段(如parameter_value_1parameter_value_2等),并通过程序逻辑或者数据库存储过程来确保这些值的正确插入和更新。
    • 与产品表和参数定义表的关联可以方便地获取产品的其他信息以及制程参数的详细定义,为后续计算良品率等操作提供完整的数据支持。

产品表(Product Table)(可选但推荐)

  • 目的:存储产品的基本信息,如产品名称、产品型号等。这有助于更好地组织和管理生产数据,特别是当涉及多种产品的生产时。
  • 结构示例
    Column NameData TypeDescription
    product_idInteger产品的唯一标识符(关联生产数据表)
    product_nameVARCHAR产品的名称
    product_modelVARCHAR产品的型号
  • 用途说明
    • 通过与生产数据表的关联,可以在查询和分析生产数据时获取产品的详细名称和型号等信息,使数据更具可读性和可分析性。例如,在计算良品率并展示结果时,可以同时显示产品名称和型号,方便用户理解数据。

关联关系和数据完整性约束

  • 关联关系
    • 生产数据表通过product_id与产品表关联,获取产品的基本信息。
    • 生产数据表中的制程参数值字段(如parameter_value_1等)通过参数定义表中的parameter_id间接关联,以确定每个参数值对应的参数名称、类型和单位等信息。
    • 参数标准表通过product_id与生产数据表关联,通过parameter_id与参数定义表关联,从而建立起产品、制程参数标准和实际生产数据之间的完整关系。
  • 数据完整性约束
    • 在参数标准表中,product_idparameter_id的组合应该是唯一的,以确保每个产品对于每个制程参数只有一组合格标准。
    • 在生产数据表中,production_id应该是唯一的,用于唯一标识每个生产批次。同时,可以设置外键约束,确保product_id在产品表中存在,制程参数值字段与参数定义表中的数据类型和其他约束相匹配。

这种表模型设计可以灵活地适应制程参数的动态变化,方便对生产数据和制程标准进行管理、查询和分析,无论是计算良品率还是进行其他质量控制相关的操作都能够提供良好的数据支持。

 

如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。

专栏 原价99,现在活动价59.9,按照阶梯式增长,还差5个人上升到69.9,最终恢复到原价。

专栏优势:
(1)一次收费持续更新。

(2)实战中总结的SQL技巧,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战技巧,方法独特】

 SQL很简单,可你却写不好?每天一点点,收获不止一点点-CSDN博客 

(3)实战中数仓建模技巧总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(如果只懂数据建模而不懂业务建模,数仓体系认知是不全面的)

(4)数字化建设当中遇到难题解决思路及问题思考。

我的专栏具体链接如下:

 数字化建设通关指南_莫叫石榴姐的博客-CSDN博客 

378181208b554fc1864232d278e89cde.png

标签:良品率,product,制程,production,参数,SQL,id,quantity
From: https://blog.csdn.net/godlovedaniel/article/details/144502839

相关文章

  • 计算机毕业设计原创定制(免费送源码):Java+Springboot+MySQL 水环境检测系统的设计与实现
    摘 要在我国,水源的污染是不可忽视的问题。对于水质监测进行数据的采集工作,目前主要通过人工实现。因此,部分地区的采集工作,实施起来难度很大,比如恶劣环境和偏僻山区等地。所以,目前对于水质监测的研究,主导方向是建立更加高效完善,智能化的水质监测系统。近几年,无线传......
  • mysql9.1.0.msi的安装报错——Database_initialization_failed
    报错LogBeginningconfigurationstep:WritingconfigurationfileSavingmy.iniconfigurationfile...Savedmy.iniconfigurationfile.Endedconfigurationstep:WritingconfigurationfileBeginningconfigurationstep:UpdatingWindowsFirewallrulesA......
  • MySQLDay1
    MySQLDay1MySQL简介MySQL是一个典型的关系数据库,目前是Oracle公司产品之一,也是目前主流使用的关系型数据库之一。使用MySQL可以进行最基本的数据存储、管理、查询等操作,也可以方便的组建数据库集群,配置读写分离。MySQL数据库同样使用SQL(结构化查询语言)来进行操作,同时MySQL数据......
  • 【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
    【问题分类】功能使用【关键字】char,char(1)【问题描述】MySQL迁移至崖山环境,字段类型源端和目标端都为char(2),但应用存储的数据为'0'、'1',此时崖山查询该表字段时会自动补充空格【问题原因分析】mysql有sql_mode控制,检查是否启用了PAD_CHAR_TO_FULL_LENGTHSQL模式。如果启用......
  • Mysql端口转发实现跨服务器跨网络实现mysql访问
    端口可以通过Nginx进行转发,针对您提到的A、B、C三台服务器的网络状况和需求,可以通过Nginx在B服务器上配置端口转发,使得A服务器能够通过B服务器访问C服务器上的数据库。以下是实现这一目标的步骤:一、确认Nginx模块支持Nginx实现TCP端口转发,需要依赖stream模块。因此,需要确认Ngin......
  • MYSQL数据库设计操作规范 ❤️【建议收藏】
    1.背景及其意义MySQL数据库与Oracle、SQLServer等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本文档旨在帮助或指导数据中心全体人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL编写等方面予......
  • Day33:安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访问控制
    一,JavaEE-过滤器Filter1,过滤器的含义:Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现......
  • 5.mysql中的触发器
    创建存储过程和函数触发器●createtrigger语句用来创建一个触发器,触发器的作用是当表上有对应SQL语句发生时,则触发执行●触发器创建时需要指定对应的表名tbl_namecreate [definer={user|current_user}] triggertrigger_name trigger_timetrigger_event ontbl......
  • 8.mysql表分区
    MySQL表分区 表分区是将⼀个表的数据按照⼀定的规则⽔平划分为不同的逻辑块,并分别进⾏物理存储,这个规则就叫做分区函数,可以有不同的分区规则 5.7可以通过showplugins语句查看当前MySQL是否⽀持表分区功能 MySQL8.0移除了showplugins⾥对partition的显示,但社区版本的表分区......
  • 2.mysql授权认证
    权限系统介绍●什么是权限系统权限系统是授予来自某个主机的某个用户可以查询、插入、修改、删除等数据库操作的权限不能明确的指定拒接某个用户的连接权限控制(授权与收回)的执行语句包括createuser,grant,revoke授权后的权限都会存放在MySQL的内部数据库中(数据库名叫做mys......