格式化子查询以正确获取数据组
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。以上是关于格式化子查询以正确获取数据组的主要内容,如果未能解决你的问题,请参考以下文章
如何正确 json_normalize 以便我以正确的格式获取数据帧?