格式化子查询以正确获取数据组

时间:2019-06-13 16:22:09

标签: sql oracle subquery

我的任务是创建一个查询,该查询将在很短的时间内扫描两个生产标签时通知我们的团队。

我为此使用的表和字段是:

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时间中的差异<(“ Fill Time” * .5)

某些子查询和分组依据是否可能?

我知道比较“填充时间”(以秒为单位)和DISPO_DATE的差异(以DATE TIME格式)会存在问题。如何解决这一问题的最佳实践是什么?

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

1 个答案:

答案 0 :(得分: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