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

Posted

技术标签:

【中文标题】格式化子查询以正确获取数据组【英文标题】: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 格式进行比较会有问题。解决这个问题的最佳做法是什么?

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

【问题讨论】:

【参考方案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。

以上是关于格式化子查询以正确获取数据组的主要内容,如果未能解决你的问题,请参考以下文章

水晶报告:无法确定获取此报告数据所需的查询

如何正确实现 Parse 查询以获取有序数据

SQLITE:查询以表格格式获取数据

如何正确 json_normalize 以便我以正确的格式获取数据帧?

Rails 5 - 如何为activerecord获取serializable_hash?

正确查询以获取 PostgreSQL 数据库中的当前连接数