oracle 常见sql 解析

sql 复制代码
SELECT trackInTime, trackOutTime, trackInQty, trackOutQty, stepNo, woId, partNo, lotId, eqpCode, stepName, standardTime, createBy
FROM
(
    SELECT TO_CHAR(MIN(CASE WHEN OPERATION = 'IN' THEN lh.CREATED END), 'YYYY-MM-DD HH24:MI:SS') AS trackInTime,
           TO_CHAR(MAX(CASE WHEN OPERATION = 'OUT' THEN lh.CREATED END), 'YYYY-MM-DD HH24:MI:SS') AS trackOutTime,
           TO_CHAR(MAX(CASE WHEN OPERATION = 'IN' THEN lh.TRACK_IN_QTY END)) AS trackInQty,
           TO_CHAR(MAX(CASE WHEN OPERATION = 'OUT' THEN lh.TRACK_OUT_QTY END)) AS trackOutQty,
           lh.STEP_NAME AS stepNo,
           lh.WO_ID AS woId,
           lh.PART_NO AS partNo,
           lh.LOT_ID AS lotId,
           lh.EQP_CODE AS eqpCode,
           ro.OP_NAME AS stepName,
           pt.CANON_TIME AS standardTime,
           LISTAGG(lh.CREATE_BY, ',') WITHIN GROUP (ORDER BY lh.CREATE_BY) AS createBy
    FROM
    (
        SELECT lh.*,
               ROW_NUMBER() OVER (PARTITION BY lh.CREATED, lh.CREATE_BY ORDER BY lh.CREATED) AS rn
        FROM R_WIP_LOT_HIS lh
    ) lh
    LEFT JOIN C_ROU_OPER ro ON lh.STEP_NAME = ro.OP_ID
    LEFT JOIN C_CANON_PART_TIME pt ON pt.STEP_NAME = lh.STEP_NAME AND pt.PART_NO = lh.PART_NO
    WHERE lh.rn = 1
      AND (lh.OPERATION = '入站' OR lh.OPERATION = '出站')
  
    GROUP BY lh.STEP_NAME, lh.WO_ID, lh.PART_NO, lh.LOT_ID, lh.EQP_CODE, ro.OP_NAME, pt.CANON_TIME, lh.TASK_ID
) tmp_count WHERE trackInTime BETWEEN '2024-06-14' AND '2024-09-09'

1. 数据表及字段说明

R_WIP_LOT_HIS表包含有关生产过程中每个批次历史记录的数据。

C_ROU_OPER表包含生产工步的操作信息。

C_CANON_PART_TIME表包含标准时间信息。
2. 子查询

第一个子查询lh中,使用ROW_NUMBER()对历史记录进行编号,以便在后续查询中使用。
3. 主查询

主查询从子查询lh中选择相关字段,并根据OPERATION为"入站"或"出站"以及数据行号为1的条件过滤数据。

使用TO_CHAR函数将CREATED字段转换为指定格式的trackInTime和trackOutTime。

通过MAX(CASE WHEN OPERATION = '入站' THEN lh.TRACK_IN_QTY END)和MAX(CASE WHEN OPERATION = '出站' THEN lh.TRACK_OUT_QTY END)获取trackInQty和trackOutQty。

通过LEFT JOIN操作连接C_ROU_OPER和C_CANON_PART_TIME表,以获取stepName、standardTime等字段信息。

使用LISTAGG函数将CREATE_BY字段聚合为逗号分隔的字符串。

最后,通过GROUP BY对结果进行分组。
4. 条件筛选

主查询中添加条件trackInTime BETWEEN '2024-06-14' AND '2024-09-09'以筛选出特定日期范围内的数据。

通过以上分析,可以看出该SQL语句的主要目的是从不同数据表中检索特定日期范围内相关生产工步的进出站信息及其他相关字段。

在上面的SQL查询语句中,涉及到了以下一些SQL函数,下面将对这些函数进行详细解释,并提供相近的函数作为参考:

TO_CHAR(date, format): 将日期类型转换为字符类型,格式由第二个参数指定。例如,TO_CHAR(lh.CREATED, 'YYYY-MM-DD HH24:MI:SS')将日期转换为YYYY-MM-DD HH24:MI:SS格式的字符串。

相近函数:TO_DATE(string, format): 将字符类型转换为日期类型,格式由第二个参数指定。例如,TO_DATE('2024-06-14', 'YYYY-MM-DD')将字符串转换为日期格式。 CASE WHEN condition THEN result END:

根据条件进行判断,符合条件返回相应的值。在SQL中,通过CASE WHEN语句进行条件判断和赋值操作。

相近函数:COALESCE(value1, value2): 返回参数值中的第一个非空值。如果参数值都为NULL,则返回NULL。 ROW_NUMBER() OVER (PARTITION BY

... ORDER BY ...) AS rn: 为结果集中的行数按指定的条件进行排序,并为每行分配一个唯一序号。

相近函数:RANK() OVER (PARTITION BY ... ORDER BY ...) AS rnk: 类似于ROW_NUMBER(),但如果存在并列名次,则会跳过相等的排名。

LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY ...): 将查询结果集中的行合并为一个单独的字符串,使用特定的分隔符。

ORDER BY子句用于对合并的结果进行排序。

相近函数:GROUP_CONCAT(expression ORDER BY ... SEPARATOR ... ): 用于MySQL,类似于LISTAGG函数,将多行数据合并为一个字符串,并使用指定的分隔符分隔。

相关推荐
2401_857600951 小时前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
潇湘秦2 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石2 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
从以前2 小时前
Berlandesk 注册系统算法实现与解析
数据库·oracle
m0_748233883 小时前
SQL语句整理五-StarRocks
数据库·sql
AI理性派思考者7 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
drebander7 小时前
SQL 实战-巧用 CASE WHEN 实现条件分组与统计
大数据·数据库·sql
18号房客7 小时前
高级sql技巧进阶教程
大数据·数据库·数据仓库·sql·mysql·时序数据库·数据库架构
Dawnㅤ7 小时前
使用sql实现将一张表的某些字段数据存到另一种表里
数据库·sql
黄金右肾8 小时前
Qt之数据库使用(十四)
sql·qt·sqlite·database