Microsoft SQL 查询 - 从第二个表返回最后一条记录
Posted
技术标签:
【中文标题】Microsoft SQL 查询 - 从第二个表返回最后一条记录【英文标题】:Microsoft SQL Query - Return last record from second table 【发布时间】:2015-01-11 17:21:45 【问题描述】:我有 2 个要运行查询的表。第一个表是dbo.Incidents
,它与主键 IncidentID.
联系第二个表是dbo.IncidentActions
,它具有主键 ActionID
并有一个字段@987654325 @ 与第一个表链接。
有许多具有相同IncidentID
的操作,我希望每个IncidentID
只返回1 行,最后一个ActionID
用于IncidentID
。
谢谢 Andomar - 我保证快到了 :)
select *
from (
select i.IncidentID
, ia.ActionID
, RIGHT('' + CAST(DATEDIFF(mi, ia.ActionTime, CONVERT([varchar], GETDATE(), 14))
/ 60 % 60 AS VARCHAR), 2) + ' hr(s) ' + RIGHT('' + CAST(DATEDIFF(mi, ia.ActionTime, CONVERT([varchar], GETDATE(), 14)) % 60 AS VARCHAR), 2) + ' min(s)' AS LastActionTime
, row_number() over (
partition by i.IncidentID
order by ia.ActionID desc) as rn
from dbo.Incident i
join dbo.IncidentAction ia
on i.IncidentID = ia.IncidentID
) as SubQueryAlias
where rn = 1
现在一切正常,我只想设置 Where ia.ActionDate = GetDate() - 似乎无法正常工作
【问题讨论】:
【参考方案1】:如果您只是在查找每个事件的顶部 ActionID
:
select i.IncidentID
, max(ia.ActionID) as MaxActionIdForIncident
from Incidents i
join IncidentActions ia
on i.IncidentID = ia.IncidentID
group by
i.IncidentID
如果IncidentActions
表有一个时间戳列,您想使用它来确定要返回哪一行,您可以使用row_number()
窗口函数:
select *
from (
select i.IncidentID
, ia.ActionID
, ia.ActionByUser -- Note: now you return any column
, row_number() over (
partition by i.IncidentID
order by ia.ActionTimestamp desc) as rn
from Incidents i
join IncidentActions ia
on i.IncidentID= ia.IncidentID
) as SubQueryAlias
where rn = 1 -- Latest action per incident only
子查询是必需的,因为您不能在where
子句中使用窗口函数。如需更多示例,请浏览greatest-n-per-group 标签。
【讨论】:
感谢您的帮助 - 如果您可以帮助我设置另一个 Where 条件,我已经更新了底部的问题。 试试where cast(ActionDate as date) = cast(getdate() as date)
以上是关于Microsoft SQL 查询 - 从第二个表返回最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章