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

相关推荐
曹牧25 分钟前
oracle:NOT IN
数据库·oracle
CoderJia程序员甲2 小时前
GitHub 热榜项目 - 日榜(2025-10-18)
ai·开源·大模型·github·ai教程
JinSo5 小时前
pnpm monorepo 联调:告别 --global 参数
前端·github·代码规范
DokiDoki之父5 小时前
Mybatis—入门 & (配置)SQL提示和日志输出
数据库·sql·mybatis
木易2.06 小时前
从零构建RAG知识库管理系统(二)
数据库·oracle
表示这么伤脑筋的题我不会11 小时前
Oracle 21C 部署ogg踩过的坑
数据库·oracle
绝无仅有11 小时前
面试真实经历某商银行大厂数据库MYSQL问题和答案总结(二)
后端·面试·github
绝无仅有11 小时前
通过编写修复脚本修复 Docker 启动失败(二)
后端·面试·github
fredinators12 小时前
数据库flask访问
数据库·oracle·flask
TDengine (老段)21 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine