首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在有条件的情况下逐组选择第一项?

如何在有条件的情况下逐组选择第一项?
EN

Stack Overflow用户
提问于 2019-06-14 18:55:54
回答 2查看 164关注 0票数 0

我有一个具有以下布局的表,用于存储用户订单,并记住当前正在处理哪些订单:

代码语言:javascript
复制
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
  • 一旦订单完成,它将从此列表中删除。

所以,过了一段时间后,这可能是这样的:

代码语言:javascript
复制
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上,那么我必须支持这些问题(按照这个顺序):

  • PostgreSQL
  • MariaDB
  • MySQL
  • SQL Server
  • MongoDB

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-14 18:59:19

我想抓住了你的逻辑:

代码语言:javascript
复制
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;

获取一行是特定于数据库的,但其余的是相当通用的。

票数 1
EN

Stack Overflow用户

发布于 2019-06-14 19:03:33

您可以使用ROW_NUMBER()窗口函数获得要处理的下一个订单,如下所示:

代码语言:javascript
复制
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中获得。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56603775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档