使用MAX in CASE语句查找数据库中的最新更新记录

时间:2017-11-22 08:51:47

标签: sql sql-server

我的桌子上有APPLICATIONSTATUSLOG_ID主键字段。

为了找出我的数据库中的最后更新记录,MAX(APPLICATIONSTATUSLOG_ID)被认为是最近的记录。

我试过这段代码:

SELECT
    MAX(CASE WHEN MAX(d.ApplicationStatusLog_ID) = d.ApplicationStatusLog_ID THEN d.ApplicationStatusID END) AS StatusID, 
FROM
    ApplicationStatusLog d

但我得到错误:

  

消息130,级别15,状态1,行53无法对包含聚合或子查询的表达式执行聚合函数。

我的桌子看起来像是 ApplicationID - ApplicationStatusID - ApplicationStatusLogID
10000 17 100
10000 08 101
10000 10 102
10001 06 103
10001 10 104
10002 06 105
10002 07 106

我的输出应该是:
10000 10
10001 10
10002 07
请帮助我理解并解决我的问题。

3 个答案:

答案 0 :(得分:1)

如果您想查找上次更新的行,只要它在APPLICATIONSTATUSLOG_ID列中具有最大值。查询将是:

SELECT *
FROM ApplicationStatusLog 
WHERE ApplicationStatusLog_ID = (SELECT MAX(ApplicationStatusLog_ID) FROM ApplicationStatusLog )

修改

正如您在评论中所述,对它的查询将是:

DECLARE @statusId INT
SELECT @statusId = STATUSID
FROM ApplicationStatusLog 
WHERE ApplicationStatusLog_ID = (SELECT MAX(ApplicationStatusLog_ID) FROM ApplicationStatusLog )

编辑2:

根据您的编辑查询将是:

 WITH C AS
(
    SELECT ApplicationID,ApplicationStatusID,ApplicationStatusLogID, ROW_NUMBER() OVER (PARTITION BY ApplicationID ORDER BY ApplicationStatusLogID DESC) AS ranking
    FROM ApplicationStatusLog
)
SELECT ApplicationID,ApplicationStatusID
FROM C
WHERE ranking = 1

答案 1 :(得分:0)

你可以像这样两次加入同桌:

select IT.JoiningID, JT.MAXAPPLICATIONSTATUSID FROM dbo.[Table] IT 
    INNER JOIN (
        Select JoiningID, MAX (APPLICATIONSTATUSID) MAXAPPLICATIONSTATUSID
            FROM dbo.[Table] 
            GROUP BY JoiningID
    ) JT ON IT.JoiningID = JT.JoiningID

现在每个ID都有MAXAPPLICATIONSTATUSID,因此你可以根据MAXAPPLICATIONSTATUSID写出你的魔杖。

答案 2 :(得分:0)

没有完整查询

SELECT 
 x.StatusId
 ...
FROM  <Table> a
CROSS APPLY
(
 SELECT x.APPLICATIONSTATUSID as StatusId
 FROM  <Table> x
 HAVING MAX(APPLICATIONSTATUSLOG_ID) = a.APPLICATIONSTATUSLOG_ID
 GROUP BY x.APPLICATIONSTATUSID
)