我有一个具有以下布局的表,用于存储用户订单,并记住当前正在处理哪些订单:
Sequence | User | Order | InProcess
---------+------+-------+----------
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 1 | 3 |
6 | 4 | 1 |
7 | 2 | 2 |例如,行4 | 3 | 1 |指的是用户3的第4次订单,这是他/她的第一次订单。现在我想选择下一步要处理的顺序。这项工作必须按照下列标准进行:
InProcess。所以,过了一段时间后,这可能是这样的:
Sequence | User | Order | InProcess
---------+------+-------+----------
1 | 1 | 1 | X
2 | 1 | 2 |
3 | 2 | 1 | X
4 | 3 | 1 | X
5 | 1 | 3 |
6 | 4 | 1 |
7 | 2 | 2 |当现在被要求处理下一个订单时,答案将是序列号6的行,因为用户1、2和3的订单已经在处理中,因此可能不会处理其他订单。问题是:我如何有效地进入这一行?
基本上,我需要的是SQL等效的
在所有订单中,选择未正在处理的第一个订单,并且其用户没有已处理的订单。
问题是如何用SQL判断这一点?顺便说一句:我正在寻找一种标准的SQL解决方案,而不是DBMS特有的方法。但是,如果出于任何原因将问题限制在特定的DBMS上,那么我必须支持这些问题(按照这个顺序):
有什么想法吗?
发布于 2019-06-14 18:59:19
我想抓住了你的逻辑:
select t.*
from (select t.*, max(in_process) over (partition by user_id) as any_in_process
from t
) t
where any_in_process is null
order by sequence
fetch first 1 row only;获取一行是特定于数据库的,但其余的是相当通用的。
发布于 2019-06-14 19:03:33
您可以使用ROW_NUMBER()窗口函数获得要处理的下一个订单,如下所示:
select *
from (
select
*,
row_number() over(order by "order", "sequence") as as rn
from t
where "user" not in (
select "user" from t where inprocess = 'X'
)
) x
where rn = 1可在PostgreSQL,MariaDB 10.2,MySQL 8.0,Server 2012中获得。
https://stackoverflow.com/questions/56603775
复制相似问题