首页 > 解决方案 > 具有逐行子查询的 sql 列

问题描述

给定一个像这样的表:

ID 命令 日期 地位 描述
1 55 2020-05-10 要求 一些描述
2 62 2020-10-15 要求 其他一些描述
3 55 2020-05-11 加工 一些描述
4 72 2020-06-09 待办的 另一种描述

我想要一个带有添加列的视图,该列将向我显示完成状态。因此,实际上,不完整订单是那些只有一条请求状态的记录,但没有其他记录。请注意,我的示例表甚至有一个未完成的订单。它没有初始“请求”状态(订单 72),但由于其他所有状态都被视为“完成”,因此 IncompleteOrder 列应为 FALSE

此结构用于记录与客户端的交互调用,因此您可以看到,每个订单号可能有 0,1 或几条指示状态变化的记录。我无法修改这个结构,因为它是一个已经制作好的系统。

我想要的结果(使用mariaDB)是

命令 描述 订单不完整
55 一些描述 错误的
62 其他一些描述 真的
72 另一种描述 错误的

订单 72 被视为“完成”,只是因为它不处于“请求”状态

完成就足够了,但最好知道最后的状态是什么(因为有一个日期字段):

命令 日期 地位 描述 订单不完整
55 2020-05-11 加工 一些描述 错误的
62 2020-10-15 要求 其他一些描述 真的
72 2020-06-09 待办的 另一种描述 错误的

谢谢

标签: sqlmariadb

解决方案


嗯。. . 我认为窗口函数是最简单的解决方案:

select t.*, (cnt_order = 1 and cnt_request = 1) as is_complete_order
from (select t.*,
             row_number() over (partition by order order by dates desc) as seqnum,
             count(*) over (partition by order) as cnt_order,
             sum(status = 'Request') over (partition by order) as cnt_request
      from t
     ) t
where seqnum = 1;

推荐阅读