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

相关推荐
独隅4 小时前
GitHub Actions 自动化运维实战:CI/CD 流水线一体化效果展示
运维·自动化·github
fthux5 小时前
装闭 RenoPit 源码解析(05):FastAPI与Celery如何执行AI装修分析
人工智能·ai·开源·github·open source·renopit
灯澜忆梦6 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
YuePeng9 小时前
一个注解起家,25 个模块收尾:Erupt 的生态版图长这样
后端·github
我是若尘11 小时前
发布分支落后于主干,MR 全是冲突?聊聊业界怎么治这个“祖传”难题
github
Exclusive_Cat11 小时前
MySQL回表机制解析与优化策略
数据库·sql
影寂ldy12 小时前
SQL 索引(Index)完整笔记
数据库·笔记·sql
笨鸟先飞,勤能补拙12 小时前
网络安全等级保护 2.0:从定级备案、建设整改到持续合规的系统指南
网络·人工智能·windows·安全·web安全·网络安全·github
echoVic13 小时前
CI 已经绿了,为什么你的 Agent 还在用旧规则?
github
echoVic13 小时前
AI 评审最怕的不是漏报,而是审完以后代码已经变了
github