Sql 按最新日期列汇总表,从两列中仅选择一个值
我在MS access工作,访问轨道设备(设备参考位于第一列:EquipmentID,一些设备可以连接到其他设备或单独) 这张表与此相似Sql 按最新日期列汇总表,从两列中仅选择一个值,sql,ms-access,Sql,Ms Access,我在MS access工作,访问轨道设备(设备参考位于第一列:EquipmentID,一些设备可以连接到其他设备或单独) 这张表与此相似 EquipmentID | AuxiliaryID | Location | LastDate | OtherInfo _____________________________________________________________ Truck 1 | Trailer 2 | Town 1 |01/02/2016| Info 1
EquipmentID | AuxiliaryID | Location | LastDate | OtherInfo
_____________________________________________________________
Truck 1 | Trailer 2 | Town 1 |01/02/2016| Info 1 |
Truck 2 | Trailer 3 | Town 2 |01/03/2016| Info 2 |
Truck 3 | | Town 3 |01/04/2016| Info 3 |
Truck 4 | | Town 4 |01/05/2016| Info 4 |
Trailer 1 | | Town 5 |01/06/2016| Info 5 |
Trailer 2 | | Town 6 |01/01/2016| Info 6 |
Trailer 3 | | Town 7 |01/08/2016| Info 7 |
我正在努力了解设备的状态(最新日期指定的最后位置)。我试图实现的目标如下表所示:
EquipmentID | AuxiliaryID | Location | LastDate | OtherInfo
_____________________________________________________________
Truck 1 | Trailer 2 | Town 1 |01/02/2016| Info 1
Truck 2 | | Town 2 |01/03/2016| Info 2
Truck 3 | | Town 3 |01/04/2016| Info 3
Truck 4 | | Town 4 |01/05/2016| Info 4
Trailer 1 | | Town 5 |01/06/2016| Info 5
Trailer 3 | | Town 7 |01/08/2016| Info 7
- 如果EquimentID中的值不在辅助ID中,则返回该行,例如:卡车3、卡车4、拖车3。退回那一排
- 如果EquipmentID中的值出现在AuxliaryID(拖车2、拖车3)中,则比较日期(LastDate)以检查最新的日期。
- 拖车2位于第一行和第六行,但第一行具有最新日期,因此不要返回第六行
- 拖车3位于第二行和最后一行,但最后一行是最新日期,因此返回最后一行并从第一行删除辅助ID
我可以在SQL查询中这样做吗?您可以通过查找最长日期并选择包含该信息的行来选择最后一行 这里有一种方法:
select t.*
from Trucks as t
where t.LastDate = (select max(t2.LastDate)
from Trucks as t2
where t2.EquipmentId = t.EquipmentId
);
请试试这个
SELECT
t1.EquipmentID,
t2.EquipmentID as AuxiliaryID,
t1.Location,
t1.LastDate,
t1.OtherInfo
FROM Trucks t1
left join Trucks t2 on t1.AuxiliaryID = t2.EquipmentID and t1.LastDate > t2.LastDate
inner join (
select EquipmentID, max(LastDate) as MaxLastDate
from (
select EquipmentID, LastDate
from Trucks
UNION
select AuxiliaryID, LastDate
from Trucks where AuxiliaryID is not null) a
group by EquipmentID) maxdates
on t1.EquipmentID = maxdates.EquipmentID and t1.LastDate = maxdates.MaxLastDate;
试试这个:
select
max(case when src = 'e' then p.equipmentID end) as equipID,
max(case when src = 'a' then p.EquipmentID end) as auxID,
Location,
t.LastDate,
OtherInfo
from
trucks t inner join
(select
src,
EquipmentID,
LastDate,
ROW_NUMBER() OVER(PARTITION BY EquipmentID ORDER BY lastDate desc) rn
from
(SELECT 'e' as src, EquipmentID, LastDate FROM Trucks
union all
SELECT 'a' as src, AuxiliaryID, LastDate FROM Trucks
where AuxiliaryID is not null) u) p on
rn = 1 and
t.lastdate = p.LastDate and
(t.equipmentid = p.equipmentid or
t.auxiliaryID = p.equipmentid )
group by Location, t.LastDate, OtherInfo
order by t.LastDate
请添加有关所需输出的更多说明。您希望输出与原始表相同,除非以下条件之一为真:1。设备在辅助ID列中的时间晚于在设备ID列中的时间,或2。一件设备在EquipmentID列中的时间晚于在辅助ID列中的时间。在案例1中,您希望返回设备位于辅助ID列中的记录。在案例2中,您希望将记录返回到设备ID列中的设备位置,而不希望将其显示在辅助ID列中的任何位置。感谢您重新表述我的请求a-cat-named-midnight谢谢您的回答。但是,我希望结果中的值在EquipmentID和AuxiliaryID@AminTN . . . 你的样本数据并非如此。如果你还有其他问题,那就把它当作另一个问题来问。以使答案无效的方式改变问题是不礼貌的。对不起,戈登。这个问题需要一个更好的描述,我已经把输入表和预期的输出。您的查询返回与输入相同的表。谢谢您的回答。谢谢你的回答,我选择了另一个答案,因为access支持行号