我们在公司使用 php/postgresql 进行流程控制。 公司为维修单位,维修过程由过程控制系统跟踪。
单位表存储有关各个单位的信息。
- unit.id : 单元的id
- unit.sn : 单元的序列号
unit_process 表存储单元在其生命周期中经历的每个过程步骤。
- unit_process.id : 流程步骤的id
- unit_process.unit_id : 单元的id
- unit_process.process_id :进程的 ID。
(真正的表有更多的列)
按时间顺序查找单位流程步骤的sql:
SELECT process_id
FROM unit
INNER JOIN unit_process on unit.id=unit_process.unit_id
ORDER BY unit_process.id
我想创建一个查询,查找在具有特定 process_id 的流程步骤之前发生的所有流程步骤
所以我有一个 process_id,我需要找到在具有该 process_id 的进程之前发生的所有 unit_process 行
目前我正在使用我能想象到的最糟糕的方法。
例如,我需要在 process_id=17 的进程之前发生的所有先前进程步骤
首先,我列出了具有 process_id=17 进程的单元
SELECT unit.id
FROM unit
INNER JOIN unit_process on unit.id=unit_process.unit_id
WHERE process_id=17
然后我将它们存储在一个 php 数组中。
其次,我使用一个 php foreach,它包含以下查询,用于我从上一个查询中获得的每个单元 ID。
SELECT id,process_id
FROM unit_process
WHERE unit_id=$unit_id
ORDER BY id
在此之后,我可以使用 php 轻松找出 process_id=17 流程步骤之前的流程,因为我只需要找到仍然低于 (process_id=17) 的最大 id 值。
它可以在那个 foreach 中使用多达数千个查询,我想改变它,但我没有足够的 SQL 知识来自己做。
是否可以在单个查询中执行此操作?
示例输入 需要绿色,黄色是 process_id=17 单位。请注意,还需要一个 process_id=17 :
示例输出:
我希望我没有弄乱样本,我只是想出了这些例子。
最佳答案
我认为您正在寻找超前/滞后窗口函数。请在此处查看专家解释:How to compare the current row with next and previous row in PostgreSQL?
关于sql - 查找在特定流程步骤之前发生的单元流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22908998/