PL/SQL Return 每个分组只有 1 行
PL/SQL Return Only 1 Row for Each Grouping
我有 table 列出了如下项目。它基本上具有操作编号 (OP_NO),用于说明产品在流程中所处的位置。这些 OP 编号可以是 Released 或 Completed。他们遵循一个过程,如 10 必须在 20 之前发生,20 必须在 30 之前发生等等。但是用户实际上并没有更新所有步骤,所以我们最终完成了一些无序的项目,而前面的步骤并不如下所示(OP30已完成,但 OP 10 和 20 尚未完成)。
我基本上想生成每个 ORDER_ID 的列表,显示每个 ORDER_ID 的最远完成点。我想我可以通过查询 STATUS = 'Completed' 和按 OP_NO Desc 排序来做到这一点。但是我不知道如何为每个 ORDER_ID 只产生 1 个结果。例如在ORDER_ID 345 完成第10步和第20步。我只想 return STEP 20 是它当前所在的位置。我想我可以用 'WHERE ROWNUM <= 1' 做到这一点,但运气不佳。有高手能指点一下吗?
谢谢!
ORDER_ID | ORDER_SEC | ORDER_RELEASE | OP_NO | STATUS | Description
123 2 3 10 Released Op10
123 2 3 20 Released Op20
123 2 3 30 Completed Op30
123 2 3 40 Released Op40
345 1 8 10 Completed Op10
345 1 8 20 Completed Op20
345 1 8 30 Released Op30
345 1 8 40 Released Op40
如果我理解正确你想要什么,下面应该满足你的需要。只需将测试 table 替换为您的 table 名称即可。
select *
from test_table tst
where status = 'Completed'
and op_no = (select max(op_no)
from test_table tst1
where tst.order_id = tst1.order_id
and status = 'Completed');
根据您的样本数据,这产生了以下结果。
Order_Id Order_Sec Order_Release op_no Status Description
123 2 3 30 Completed Op30
345 1 8 20 Completed Op20
干杯
肖恩·彼得森
我有 table 列出了如下项目。它基本上具有操作编号 (OP_NO),用于说明产品在流程中所处的位置。这些 OP 编号可以是 Released 或 Completed。他们遵循一个过程,如 10 必须在 20 之前发生,20 必须在 30 之前发生等等。但是用户实际上并没有更新所有步骤,所以我们最终完成了一些无序的项目,而前面的步骤并不如下所示(OP30已完成,但 OP 10 和 20 尚未完成)。
我基本上想生成每个 ORDER_ID 的列表,显示每个 ORDER_ID 的最远完成点。我想我可以通过查询 STATUS = 'Completed' 和按 OP_NO Desc 排序来做到这一点。但是我不知道如何为每个 ORDER_ID 只产生 1 个结果。例如在ORDER_ID 345 完成第10步和第20步。我只想 return STEP 20 是它当前所在的位置。我想我可以用 'WHERE ROWNUM <= 1' 做到这一点,但运气不佳。有高手能指点一下吗?
谢谢!
ORDER_ID | ORDER_SEC | ORDER_RELEASE | OP_NO | STATUS | Description
123 2 3 10 Released Op10
123 2 3 20 Released Op20
123 2 3 30 Completed Op30
123 2 3 40 Released Op40
345 1 8 10 Completed Op10
345 1 8 20 Completed Op20
345 1 8 30 Released Op30
345 1 8 40 Released Op40
如果我理解正确你想要什么,下面应该满足你的需要。只需将测试 table 替换为您的 table 名称即可。
select *
from test_table tst
where status = 'Completed'
and op_no = (select max(op_no)
from test_table tst1
where tst.order_id = tst1.order_id
and status = 'Completed');
根据您的样本数据,这产生了以下结果。
Order_Id Order_Sec Order_Release op_no Status Description
123 2 3 30 Completed Op30
345 1 8 20 Completed Op20
干杯
肖恩·彼得森