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函数,将多行数据合并为一个字符串,并使用指定的分隔符分隔。

相关推荐
comcoo6 小时前
龙虾 AI OpenClaw Windows 本地部署,5 分钟落地专属私有化 AI 智能体
github·开源软件·龙虾ai·open claw部署
abcy0712137 小时前
pycharm python sqlalchemy mysql增删改查实例csdn
数据库·oracle
胖胖胖胖胖虎8 小时前
SQL json_table 行转列方法
sql
网管NO.18 小时前
子查询进阶|EXISTS/IN/ANY/ALL,优化查询效率
数据库·sql
德宏大魔王(AI自动回关)8 小时前
鱿鱼云码公测:基于YOLOv26+消息队列的高性能打码平台
yolo·github·打码平台·鱿鱼云码
2601_961194029 小时前
2026六级词汇PDF下载|大学英语六级单词表+音频PDF
windows·git·eclipse·pdf·github
yuzhiboyouye11 小时前
sql增删改查怎么写?有时会不会有联表查询的增删查改
数据库·sql
xuhe212 小时前
AI时代一届计算机学生本科生 四年生活 保研记录: 四非本科 -> 中流985
ai·github·科研
IvorySQL12 小时前
【HOW 2026 分论坛演讲】PG/IvorySQL私有云中实践
数据库·人工智能·sql·postgresql
小橙讲编程12 小时前
一键给 AI Agent 装上「互联网眼睛」:Agent Reach 深度解析与实战指南
人工智能·开源·github·ai编程