我想不出适合我的问题的标题。我有一个带传送带移动箱子的自动化仓库。每个箱子都有唯一的包裹编号。有数十台扫描仪告诉箱子去哪里。每次扫描器看到一个框时,它都会在表格中创建两行(排序和确认),如下所示:
time scanner type parcel
12:00:19.635 s15 Sort 83128
12:00:20.3 s15 Confirm 83128
12:02:05.857 s18 Sort 94387
12:02:07.692 s18 Confirm 94387
因此,每个唯一的包裹号码和每个唯一的扫描仪都有很多条目。我如何编写一个查询来告诉我哪些包裹已经开始他们的旅程(由 s15 看到)但尚未到达中间部分(由 s71 或 s72 看到)?我也在考虑持续时间;盒子从s15到s71用了多长时间?或者也许这最好留给第二个问题。谢谢!
最佳答案
SELECT parcel, passed_scanners
FROM (
SELECT
parcel,
array_agg(scanner) as passed_scanners
FROM
scanners
GROUP BY parcel
)s
WHERE 's15' = ANY(passed_scanners) AND NOT (ARRAY['s71', 's72'] && passed_scanners)
- 汇总全部通过
scanner_id
每个包裹的 s - 过滤所有在
passed_scanners
中包含 #15 的地 block 行但#71 和#72(两个数组的&&
运算符检查两个数组是否包含数组元素 - 称为数组重叠)
第二部分是一个不同的查询,因为在第一部分中,您要求查询仍未到达最终扫描仪的包裹。在第二部分中,您需要计算最终到达 s71 的所有包裹的持续时间。
SELECT parcel, duration
FROM (
SELECT
parcel,
MAX(time) FILTER (WHERE scanner IN ('s71', 's72')) -
MIN(time) FILTER (WHERE scanner = 's15') AS duration,
array_agg(scanner) as passed_scanners
FROM
scanners
GROUP BY parcel
)s
WHERE 's15' = ANY(passed_scanners) AND (ARRAY['s71', 's72'] && passed_scanners)
- 再次汇总每个包裹的所有通过的 scanner_ids
- 给出扫描器 15 的第一次和扫描器 71 或 72 的最后一次。计算差异以获得持续时间。
- 过滤所有在
passed_scanners
中包含 #15 的地 block 行以及 #71 或 #72
请注意:您的 time
中没有任何日期部分如果在午夜扫描包裹,持续时间的结果可能无法正常工作。那么您在 s15 的起点可能是 23 点,目的地是 1 点。时差为 (1 - 23) = -22
.为了解决这个问题,我强烈建议保存带有日期部分的整个时间戳。
否则你必须检查:如果duration < 0
然后加24小时(但是如果包裹需要超过24小时怎么办?怎么知道你不需要加48小时?)
关于postgresql - 使用 Postgres 注入(inject)自动化日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52672974/