sql - 查找在特定流程步骤之前发生的单元流程

标签 sql postgresql

我们在公司使用 php/postgresql 进行流程控制。 公司为维修单位,维修过程由过程控制系统跟踪。

Database structure

单位表存储有关各个单位的信息。

  • 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 :

enter image description here

示例输出:

enter image description here

我希望我没有弄乱样本,我只是想出了这些例子。

最佳答案

我认为您正在寻找超前/滞后窗口函数。请在此处查看专家解释:How to compare the current row with next and previous row in PostgreSQL?

关于sql - 查找在特定流程步骤之前发生的单元流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22908998/

相关文章:

php - 表中的更改列在 postgres 中具有枚举类型

postgresql - postgres 交叉表,错误 : The provided SQL must return 3 columns

sql - 仅通过月份名称获取月份编号

mysql - 插入具有不同选择条件的多个值?

c# - 在 PostgreSQL 查询中将日期时间转换为指定格式

sql - 如何在 PostgreSQL 中将所有列的默认值设置为 null

postgresql - 串行(自动递增)主键的标签

php - 哪个更快 : to run the same sql query twice or run only once and store the result in arrays?

c# - 为什么这个指定的转换无效??

mysql - sql查询给出不一致的结果