如何使用第二个lat结果更新最后一条记录[SQLServer]

如何使用第二个lat结果更新最后一条记录[SQLServer],sql,sql-server,sql-server-2005,sql-update,Sql,Sql Server,Sql Server 2005,Sql Update,我想用第二行的通过/失败结果更新表的最后一个条目。如果表中只有一行,则查询不需要失败 这是我的代码,但它只更新了第一个条目,而不是最后第二个条目。thx求救 UPDATE DB.dbo.Testergebnisse SET Pass = ( SELECT TOP 1 Pass FROM DB.dbo.Testergebnisse WHERE TestergebnisID != (

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

这是我的代码,但它只更新了第一个条目,而不是最后第二个条目。thx求救

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

如果我正确地遵循了您的说明,那么应该可以通过使用可更新的公共表表达式来简化查询,如:

WITH cte AS (
    SELECT 
        TestergebnisID, 
        TestaufstellungID,
        Pass, 
        Fail,
        ROW_NUMBER() OVER(PARTITION BY TestaufstellungID ORDER BY TestergebnisID DESC) rn,
        LEAD(Pass)    OVER(PARTITION BY TestaufstellungID ORDER BY TestergebnisID DESC) prev_pass,
        LEAD(Fail)    OVER(PARTITION BY TestaufstellungID ORDER BY TestergebnisID DESC) prev_fail
    FROM DB.dbo.Testergebnisse
    WHERE TestaufstellungID = 3166
)
UPDATE cte 
SET Pass = prev_pass, Fail = prev_fail 
WHERE rn = 1
CTE使用窗口功能来:

通过使用行编号将TestergebnisID降序排列每个记录行编号 检索上一条记录的通过和失败,使用LEAD按TesterGenIsId进行测试 操作是在具有相同TestaufstellungID的记录组中执行的。您只需删除CTE中的WHERE子句,即可处理所有TestaufstellungID,而不是其中一个
然后,主查询只选择most记录rn=1,并根据上一条记录中的值分配通过和失败。如果分区不可用,则可以将最后两行插入临时表中。这样,最大值是最后一行,最小值是倒数第二行

这将为您提供要从中设置的值的ID、要更新的行的ID以及要使用的值

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
    DROP TABLE ##SourceValues
SELECT TOP 2 
TestergebnisID,Pass, Fail
INTO #Temp FROM Testergebnisse (NOLOCK)
WHERE TestaufstellungID = 3166
ORDER BY TestergebnisID DESC
DECLARE @LastId INT = (SELECT MAX(TestergebnisID) FROM #Temp)
DECLARE @SecondToLast INT = (SELECT MIN(TestergebnisID) FROM #Temp)
UPDATE DB.dbo.Testergebnisse SET Pass = (SELECT Pass FROM #Temp WHERE TestergebnisID = @SecondToLast) WHERE TestergebnisID = @LastID
UPDATE DB.dbo.Testergebnisse SET Fail = (SELECT Fail FROM #Temp WHERE TestergebnisID = @SecondToLast) WHERE TestergebnisID = @LastID

我不确定我是否听懂了。给出如下数据:

TestergebnisID TestaufstellungID Pass        Fail
-------------- ----------------- ----------- -----------
1              1                 10          12
2              1                 5           6
3              1                 3           4
4              2                 0           0
您想更新TestergebnisID=3的行以及TestergebnisID=2的记录中的Pass和Fail,就这样?还是应该用记录1中的数据更新记录2

对于前者,这应该起到以下作用:

;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 
这将从1更新第2行,从2更新第3行:

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

我无法使用此功能,因为我使用的是sql server 2005 sql server版本:9.0。5057@Daniel:右,CTE和行号仅在SQL Server 2008启动时可用。。。因此,这个解决方案在SQLServer2005上确实不起作用。这真的是一个旧版本,你不考虑升级吗?当然,我会,但它不是在我手中:CTE和行数可在2005。这是滞后,是不可用的,当然这应该是领先和相同的描述顺序在所有三个顺序。显示一些示例数据,以便清楚地知道你需要什么。我们所要做的就是你不清楚的解释和一些不能满足你需要的SQL