sql - 找到第一场比赛
问题描述
我有两个大致像这样的表(仅包括相关信息):
------------ Master --------------
ID | Master_Number | First_Arrival
---------- Vehicle ------------
ID | Master_ID | Name | Arrived
在上面,Vehicle.Master_ID
是一个 FK 到Master.ID
我创建了一个像这样的表变量:
declare @foo table (Master_Number varchar(20), First_Arrival datetime, Name varchar(20), Arrived datetime)
insert into
@foo
select
M.Master_Number,
M.First_Arrival,
V.Name,
V.Arrived
from
Master as M
inner join
Vehicle as V
on
V.Master_ID = I.ID
order by M.Master_Number, V.Arrived
这给了我一个很好的列表,列出了与相同 Master_Number 相关的所有车辆,以及它们到达的顺序。
我试图做的是得到这样的东西:
--------------------------------------------- Result --------------------------------------------------
Master_Number | First_Arrival | Vehicle_1_Name | Vehicle_1_Arrived | Vehicle_2_Name | Vehicle_2_Arrived
排序在哪里Vehicle_1_Arrived < Vehicle_2_Arrived
, Vehicle_1_Name like '[ETL]%'
, 和'Vehicle_2_Name like '[TL]%'
我遇到的问题是可能有零个或多个车辆与 a 相关联Master_ID
,我只希望每一行都是与此完全匹配的第一个结果,而忽略与 that 相关的任何其他车辆Master_ID
以及任何null
值。
我是 SQL 的新手,无法解决这个问题....任何帮助将不胜感激。
解决方案
这是一个非常好的候选人apply
:
select M.Master_Number, M.First_Arrival, v1.Name, v1.Arrived,
v1.Name, v2.Arrived
from Master m cross apply
(select top (1) v1.*
from Vehicle v1
where v.Master_ID = I.ID and v1.Name like '[ETL]%'
order by v1.arrived
) v1 cross apply
(select top (1) v2.*
from Vehicle v2
where v2.Master_ID = I.ID and v2.Name like '[TL]%' and
v2.arrived > v1.arrived
order by v2.arrived asc
) v2
order by M.Master_Number;
apply
实现横向连接,这很像相关子查询,除了它可以返回多列和/或多行。
推荐阅读
- python - 烧瓶应用程序。FileNotFoundError: [Errno 2] 没有这样的文件或目录
- javascript - 在 Google Maps API 中切换标记组
- awk - 用特定值替换子字符串的 awk 命令
- css - 使用 css attr() 函数计算 sass 中的 css 顶部
- python - 模拟请求发布响应 __dict__ 和 status_code python
- r - 在 R arules 中,如何有效地将集值数据转换为项集成员数据?
- html - TestCafe:创建一个选择器,其中有多个跨度的 div
- .net-core - 在 Debian 上使用 .Net Core 的 Jenkins 管道失败 UnitTests
- xamarin - 在多个设备之间具有相同的控制宽度
- angular - NPM 构建挂在 azure dev ops 中