【问题标题】:Formatting Subqueries to Correctly Grab Groups of Data格式化子查询以正确获取数据组
【发布时间】:2019-06-13 16:22:09
【问题描述】:

我的任务是创建一个查询,当两个生产标签的扫描时间太接近时,该查询将通知我们的团队。

我使用的表格和字段是:

MASTER_LABEL - 表按顺序创建标签。一旦标签被扫描到系统中,就会填充 DISPO_DATE。

ID     ITEMNO    DISPO_DATE    STANDARD_ID   QTY
-------------------------------------------------
1      ABC       (DATE TIME)    12345        4
2      ABC       (DATE TIME)    12345        4
3      ABC       (DATE TIME)    12345        4
4      EFG       (DATE TIME)    45678        20
5      EFG       (DATE TIME)    45678        20
6      HIJ       (DATE TIME)    91011        14
7      HIJ       (DATE TIME)    91011        14
8      ABC       (DATE TIME)    12345        4
9      ABC       (DATE TIME)    12345        4

标准 - 表格用于提取周期时间以计算填充容器的平均时间。 CYCLETM 以秒为单位。

ID         CYCLETM(seconds)
----------------------------------

12345      220
45678      105
91011      175

我拥有的基本代码(我知道需要大量修改)是:

SELECT M.ITEMNO, M.DISPO_DATE, (M.QTY * S.CYCLETM) AS "FILL TIME"
FROM MASTER_LABEL M LEFT OUTER JOIN STANDARD S ON S.ID = M.STANDARD_ID
WHERE M.DISPO_DATE >= SYSDATE - .5
ORDER BY M.ITEMNO, M.DISPO_DATE

最终,我希望找出最近两个 DISPO_DATE 时间的差异,并将它们与容器的 ("Fill Time" * .5) 进行比较。我只想拉出 的 DISPO_DATE 时间的差异

这可以通过一些子查询和分组依据吗?

我知道比较“填充时间”以秒为单位和 DISPO_DATE 的差异以 DATE TIME 格式进行比较会有问题。解决这个问题的最佳做法是什么?

非常感谢您可以指导我访问的任何帖子或有助于解决此问题的内容。提前感谢您的帮助。

【问题讨论】:

    标签: sql oracle subquery


    【解决方案1】:

    您可以通过乘以 24*60*60 将两个日期的差转换为秒。这使您可以进行比较:

    SELECT *
    FROM (SELECT M.ITEMNO, M.DISPO_DATE, (M.QTY * S.CYCLETM) AS FILL_TIME,
                 LAG(M.DISPO_DATE) OVER (PARTITION BY M.ITEMNO ORDER BY M.DISPO_DATE) as PREV_DISPO_DATE
          FROM MASTER_LABEL M LEFT OUTER JOIN
               STANDARD S
               ON S.ID = M.STANDARD_ID
          WHERE M.DISPO_DATE >= SYSDATE - 0.5
         ) MS
    WHERE (DISPO_DATE - PREV_DISPO_DATE) * 24 * 60 * 60 > FILL_TIME * 0.5   
    ORDER BY M.ITEMNO, M.DISPO_DATE
    

    【讨论】:

    • 嗨,戈登,感谢您的帮助。我已经尝试了您的上述查询并且收到错误:ORA-30484: missing window specification for this function。这是来自 LAG 功能吗?我尝试使用 OVER (ORDER BY M.ITEMNO, M.DISPO_DATE, FILL_TIME/((M.QTY * S.CYCLETM)/ M.QTY, S.CYCLETM (在不同的执行中,最后一个字段由 / 分隔) . 你知道是什么原因造成的吗?
    • 除了WHERE 中拼写错误的FILL_TIME,查询在Oracle 11G Express 中运行正常:rextester.com/SHC67458
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2014-07-03
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多