sql - 具有逐行子查询的 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 | 待办的 | 另一种描述 | 错误的 |
谢谢
解决方案
嗯。. . 我认为窗口函数是最简单的解决方案:
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;
推荐阅读
- php - 在 Cloud Foundry 中安装 phpMyAdmin
- javascript - 如果 ID 包含空格,getElementByID() 方法是否有效
- node.js - 用于节点 js 的 Kafka 库
- parameters - Node.js:req.params、req.body、req.query
- three.js - 三款js VR视频角度变化陀螺仪
- python - 试图将两个 json 数据放入 python 列表但收到错误消息
- php - 当硬币为小数并且硬币返回的金额大于原始返回值时,找到硬币变化(贪婪算法)
- maps - 我正在尝试在地图上绘制从拾取位置到下落位置的折线
- php - 我如何在 CakePHP 3.9(使用 Postgres)的查询构建器中按 xxxx DESC NULLS FIRST(或 LAST)进行排序
- cmd - CMD 从 USB 恢复文件