sql - 如何使用倒数第二个结果更新最后一条记录 [SQL Server]

标签 sql sql-server sql-server-2005 sql-update

我想用倒数第二行的通过/失败结果更新表的最后一个条目。如果表中只有一行,则查询不会失败。

这是我所拥有的代码,但仅更新第一个条目,而不更新倒数第二个条目。感谢帮助

UPDATE DB.dbo.Testergebnisse 
SET 
    Pass = (
        SELECT TOP 1 Pass
        FROM DB.dbo.Testergebnisse
        WHERE 
            TestergebnisID != ( 
                SELECT MAX(TestergebnisID) FROM DB.dbo.Testergebnisse 
            )
            AND TestaufstellungID = 3166 
        ORDER BY TestergebnisID DESC
    ),
    Fail = (
        SELECT TOP 1 Fail
        FROM DB.dbo.Testergebnisse
        WHERE 
            TestergebnisID != ( 
                SELECT MAX(TestergebnisID)  FROM DB.dbo.Testergebnisse 
            ) 
            AND TestaufstellungID = 3166 
            ORDER BY TestergebnisID DESC
    )
WHERE 
    DB.dbo.Testergebnisse.TestergebnisID = ( 
        SELECT TOP 1 TestergebnisID 
        FROM DB.dbo.Testergebnisse 
        WHERE TestaufstellungID =  3166 
        ORDER BY TestergebnisID DESC
    )

SQL Server 版本:9.0.5057

最佳答案

我不确定我是否在关注。给定这样的数据:

TestergebnisID TestaufstellungID Pass        Fail
-------------- ----------------- ----------- -----------
1              1                 10          12
2              1                 5           6
3              1                 3           4
4              2                 0           0

您想要将 TestergebnisID = 3 的行更新为 TestergebnisID = 2 的记录中的“通过”和“失败”,就这样吗?或者记录 2 也应该使用记录 1 中的数据进行更新吗?

如果是前者,这应该可以解决问题:

;WITH rec AS
(
    SELECT this.TestaufstellungID 
         -- most recent for the given test run
         , MAX(this.TestergebnisID) AS LastTestergebnisID 
         -- find the previous 
         , PrevTestergebnisID =
           (SELECT MAX(prev.TestergebnisID) 
              FROM Testergebnisse prev 
             WHERE prev.TestaufstellungID = this.TestaufstellungID  
               AND prev.TestergebnisID < MAX(this.TestergebnisID )
           ) 
      FROM Testergebnisse this
     GROUP BY this.TestaufstellungID
)
UPDATE mostRecent
   SET Pass = prev.Pass
     , Fail = prev.Fail
  FROM Testergebnisse mostRecent
  JOIN rec
    ON rec.LastTestergebnisID = mostRecent.TestergebnisID 
  JOIN Testergebnisse prev
    ON prev.TestergebnisID = rec.PrevTestergebnisID 

给予:

TestergebnisID TestaufstellungID Pass        Fail
-------------- ----------------- ----------- -----------
1              1                 10          12
2              1                 5           6
3              1                 5           6       <-- 1 row affected
4              2                 0           0

如果您希望所有这些都更新为其前任的值,那么:

;WITH rec AS
(
    SELECT this.TestaufstellungID 
         -- most recent for the given test run
         , this.TestergebnisID
         -- find the previous 
         , PrevTestergebnisID =
           (SELECT MAX(prev.TestergebnisID) 
              FROM Testergebnisse prev 
             WHERE prev.TestaufstellungID = this.TestaufstellungID  
               AND prev.TestergebnisID < this.TestergebnisID
           ) 
      FROM Testergebnisse this
)
UPDATE mostRecent
   SET Pass = prev.Pass
     , Fail = prev.Fail
  FROM Testergebnisse mostRecent
  JOIN rec
    ON rec.TestergebnisID = mostRecent.TestergebnisID 
  JOIN Testergebnisse prev
    ON prev.TestergebnisID = rec.PrevTestergebnisID 

这将更新第 2 行(来自第 1 行)和第 3 行(来自第 2 行):

TestergebnisID TestaufstellungID Pass        Fail
-------------- ----------------- ----------- -----------
1              1                 10          12
2              1                 10          12       <--
3              1                 5           6        <--
4              2                 0           0

关于sql - 如何使用倒数第二个结果更新最后一条记录 [SQL Server],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55432223/

相关文章:

sql - 带有 case when 和 group by 的 Value 列的计数

sql-server - SQL Server 2016 JSON_VALUE 语法

SQL查询优化帮助请

sql - 按日期与空组分组

SQL Server : large DB Query In Chunks

sql-server - T-SQL varchar比较问题

sql - MS Access 查询不起作用

php - 减少从数据库中显示的文本

java - JDBC 查询抛出语法错误

sql-server - 为什么此 Sql Geography 在 SQL Server 2014 上为 "Valid",在 Azure SQL 上为 "Invalid"?