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 查询 - 从第二个表返回最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 最近从第二个表注册的 Id

在不借助 PL/SQL 的情况下从第二个表中查找相关值

在多个连接条件下将数据从第二个表插入一个表

使用第一个表的输出从第二个表中选择特定数据

将第二个表中的第二个(条件)结果添加到 SQL 查询

从第二个表存储过程mysql中仅通过其ID选择一个图像