sql - 从源表中的值列表中识别具有最高值的 FK
问题描述
我有下表。
部分
ID | 姓名 |
---|---|
1 | 第1部分 |
2 | 第2部分 |
3 | 第 3 部分 |
手术
ID | 姓名 | part_id | 命令 |
---|---|---|---|
1 | 作品 1 | 1 | 10 |
2 | 作品 2 | 1 | 20 |
3 | 作品 3 | 1 | 30 |
4 | 作品 1 | 2 | 10 |
5 | 作品 2 | 2 | 20 |
6 | 作品 1 | 3 | 10 |
很多
ID | part_id | Operation_id |
---|---|---|
10 | 1 | 2 |
11 | 2 | 5 |
12 | 3 | 6 |
我正在从 Lot 表中选择结果,并且我想选择一个last_Op
基于order
. operation_id
如果order
for 的值operation_id
是各自的最高值,则part_id
返回1
else return0
SELECT
id,
part_id,
operation_id,
last_Op
FROM Lot
基于上表的预期结果集。
ID | part_id | operation_id | 最后一个操作 |
---|---|---|---|
10 | 1 | 2 | 0 |
11 | 2 | 5 | 1 |
12 | 3 | 6 | 1 |
在上面的示例中,第一行返回 last_op =0
因为 operation_id = 2 与part_id
= 1 关联并且它具有最高order
= 30。由于operation_id
这部分没有指向order
最大值,0
因此返回。
其他两行返回 1,因为operation_id
5 和 6 分别与part_id
2 和 3 相关联,并且它们指向最高的“订单”值。
解决方案
如果 operation_id 的 order 值是相应 part_id 的最高值,则返回 1 否则返回 0
这听起来像窗口函数会有所帮助:
select l.*,
(case when o.order = o.max_order then 1 else 0 end) as last_op
from lot l left join
(select o.*,
max(o.order) over (partition by o.part_id) as max_order
from operations o
) o
on l.operation_id = o.id;
注意: order
是一个非常糟糕的列名称,因为它是一个 SQL 关键字。
推荐阅读
- html - CSS 使订单项文本换行
- java - 为什么在landroid/view/keyevent之前有“l”
- powershell - 更新 release def 导致错误 VS402903: The specified value is not convertible to type ReleaseDefinition
- java - 转换 XML 时禁用 JAXP 中的缩进
- rpg - Do know you an IDE online for language RPG
- xml - 我可以给 ConstraintLayout 一个“隐藏”变量吗?
- sql - 聚合函数和 unpivot
- java - Spring Boot 返回 404
- c++ - C++20 中的 constexpr std::vector 和 constexpr std::string
- python - 如何解决:IndexError:图像索引超出范围