sql - 基于 Rank 的 SQL 条件连接
问题描述
我正在尝试根据 Instrument 和 Rank 加入两个表。如果 Instrument 和 Rank 匹配,则它是直接连接。否则加入应按顺序寻找下一个可用等级。例如,如果 Instrument CDF 和 Rank 1 在表 2 中不匹配,则 sql 查询应该寻找 CDF 和 Rank 2 来匹配。如果匹配,则移至表 1 中的下一个仪器和排名。
输出的行数应与表 1 中的行数相同,并且根据上述逻辑仅匹配表 2 中的数量。表 1 不会有重复项。
任何算法或示例代码都会有很大帮助。
测试:
根据样本数据,输出应该有 3 行。
- 表 1 中的 ABC 1 应与表 2 中的 ABC 1 匹配并返回数量 55。
- 表 1 中的 CDF 1 应与表 2 中的 CDF 2 匹配,并返回 qty 作为 56。
- 表 1 中的 CDE 2 应与表 2 中的 CDE 4(不是排名 1)匹配,并返回 qty 作为 91。
希望这将澄清请求。
示例数据的预期结果:
乐器 | 数量 |
---|---|
美国广播公司 | 55 |
CDF | 56 |
CDE | 91 |
示例数据
表格1:
乐器 | 秩 | ID | 位置 |
---|---|---|---|
美国广播公司 | 1 | 2 | A1 |
CDF | 1 | 78 | 阿布格 |
CDE | 2 | 65 | 东风 |
表 2:
插件 | 数量 | 秩 |
---|---|---|
美国广播公司 | 55 | 1 |
美国广播公司 | 65 | 2 |
美国广播公司 | 76 | 4 |
CDF | 56 | 2 |
CDF | 55 | 3 |
CDF | 33 | 4 |
CDE | 78 | 1 |
CDE | 91 | 4 |
解决方案
select
*,
(
select qty
from table2 as t2
where t2.instrument = t1.instrument and t2.rank >= t1.rank
order by t2.rank limit 1
) as qty
from table1 as t1;
如果您需要多于一列table2
然后使用cross join lateral
推荐阅读
- discord.js - 如何通过邀请链接获得公会?不和谐.js
- python - 如何根据作为输入的列表正确排序 QTreeView 中的列
- powershell - 使用 Powershell 拆分文本文件
- intellij-idea - Intellij idea编辑窗口左侧栏如何添加图标?
- php - 在 php 中运行 gcloud 命令不起作用
- huawei-mobile-services - 使用服务器端华为移动服务 API 获取应用级访问令牌时出现错误代码 401
- laravel - 将当前日志流式传输到存储文件夹
- compilation - 如何获取我编辑的启动代码以进行编译?
- c++ - 难以理解某人的源代码来解决 IOI 问题
- c - 每个打印行之后有 2 个空白行