首页 > 解决方案 > 从源表中的值列表中识别具有最高值的 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如果orderfor 的值operation_id是各自的最高值,则part_id返回1else 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_id5 和 6 分别与part_id2 和 3 相关联,并且它们指向最高的“订单”值。

标签: sqlsql-servertsql

解决方案


如果 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 关键字。


推荐阅读