postgresql - 使用 Postgres 注入(inject)自动化日志

标签 postgresql

我想不出适合我的问题的标题。我有一个带传送带移动箱子的自动化仓库。每个箱子都有唯一的包裹编号。有数十台扫描仪告诉箱子去哪里。每次扫描器看到一个框时,它都会在表格中创建两行(排序和确认),如下所示:

    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用了多长时间?或者也许这最好留给第二个问题。谢谢!

最佳答案

demo:db<>fiddle

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)
  1. 汇总全部通过 scanner_id每个包裹的 s
  2. 过滤所有在 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)
  1. 再次汇总每个包裹的所有通过的 scanner_ids
  2. 给出扫描器 15 的第一次和扫描器 71 或 72 的最后一次。计算差异以获得持续时间。
  3. 过滤所有在 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/

相关文章:

java - 用于 WITH 子句和 FROM 子句中的子查询的 JPA Criteria API

python - 从 SQLAlchemy 插入到 Postgres 数据库

postgresql - 使用 Postgresql 作为 Microsoft Analysis Services 的数据源

postgresql - PostgresQL。与在 WHERE 子句中显式定义整个时间戳相比,将时间戳转换为日期的区别

sql - Postgres 中的多表 count()

PostgreSQL 在导入 CSV 时将 header 留空

sql - 在 PostgreSQL 中从 jsonb 获取特定对象时出错

postgresql - Postgres 如何在不将其复制到数据库的情况下使用 csv 文件

javascript - 如何使用 NodeJS 为 Sequelize 模型添加默认值?

mysql - 如何让flask-sqlalchemy的查询对象选择列(或说字段)?