Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中,如何根据系列的最后一次出现更新值_Sql_Sql Server - Fatal编程技术网

在SQL Server中,如何根据系列的最后一次出现更新值

在SQL Server中,如何根据系列的最后一次出现更新值,sql,sql-server,Sql,Sql Server,我在SQL Server中使用了LEAD()函数来尽我所能。我有病人、实验室和约会。我已经了解了如何获取已完成(准时)约会的最后状态和第二到最后状态。我的问题是更新“从不”或“最终”之前的所有值,使其与最后一个条目相同 EverDone Column ON-TIME = the test was done EVENTUALLY = means the very next test was completed NEVER = the last test was never done 我需要将“

我在SQL Server中使用了
LEAD()
函数来尽我所能。我有病人、实验室和约会。我已经了解了如何获取已完成(准时)约会的最后状态和第二到最后状态。我的问题是更新“从不”或“最终”之前的所有值,使其与最后一个条目相同

EverDone Column
ON-TIME = the test was done 
EVENTUALLY = means the very next test was completed
NEVER = the last test was never done
我需要将“最终”之前的所有-设置为“最终”。例如2002年的低密度脂蛋白项目

我需要设置“永不”之前的所有-,例如“血液”项

但这些标准不能像低密度脂蛋白测试那样是该系列的最后一个标准。最后一次测试从未完成,但最终完成之前的状态

Name           Item   date        Status    EverDone
----------------------------------------------------
ZZNIN, CHEEZE  BLOOD  6/6/2002    LAPSED    ---
ZZNIN, CHEEZE  BLOOD  1/6/2003    LAPSED    ---
ZZNIN, CHEEZE  BLOOD  7/8/2003    LAPSED    ---
ZZNIN, CHEEZE  BLOOD  6/15/2004   LAPSED    NEVER
SLAYER, JONES  LDL    8/19/2002   LAPSED    ---
SLAYER, JONES  LDL    10/2/2002   LAPSED    ---
SLAYER, JONES  LDL    12/12/2002  LAPSED    ---
SLAYER, JONES  LDL    12/12/2002  LAPSED    ---
SLAYER, JONES  LDL    12/16/2002  LAPSED    EVENTUALLY
SLAYER, JONES  LDL    12/26/2002  COMP      ON-TIME
SLAYER, JONES  LDL    1/8/2004    LAPSED    NEVER

如果您有一个主键,这将工作-

UPDATE TableName
SET EverDone = 'EVENTUALLY'
WHERE KeyName in (SELECT b.KeyName 
                FROM TableName a
                  join TableName b on a.Name = b.Name 
                      and a.Item = b.Item 
                      and a.Date < b.Date
                      bEverDone = '---'
                WHERE a.EverDone = 'EVENTUALLY')
UPDATE TableName
SET EverDone = 'EVENTUALLY'
WHERE CONCAT(Name, Item, Date) in (SELECT CONCAT(b.Name, b.Item, b.Date)
                FROM TableName a
                  join TableName b on a.Name = b.Name 
                      and a.Item = b.Item 
                      and a.Date < b.Date
                      bEverDone = '---'
                WHERE a.EverDone = 'EVENTUALLY')

Slayer-LDL-12/16/01之前的Slayer行也将更新。我认为这是可以的。

您不需要任何特殊函数,可以通过子选择或自连接来实现。我对sql非常陌生。你有这样的例子吗?这个表上有主键吗?或者你需要使用名称、项目和日期的组合吗?我希望有更好的方法来做第一件事-CONCAT是我想到的第一件事。你的第一件事不起作用,因为它没有提到日期。不是说它根本不起作用,而是它不能满足OP的要求。是的,这就是为什么我指定它只对给定的数据集起作用。我补充了更多的澄清。主键使它更容易-我不知道如何在那里得到第一个日期@塔巴莱曼确定了发行日期。
Name           Item   date        Status    EverDone
----------------------------------------------------
ZZNIN, CHEEZE  BLOOD  6/6/2002    LAPSED    ---
ZZNIN, CHEEZE  BLOOD  1/6/2003    LAPSED    ---
ZZNIN, CHEEZE  BLOOD  7/8/2003    LAPSED    ---
ZZNIN, CHEEZE  BLOOD  6/15/2004   LAPSED    NEVER
SLAYER, JONES  LDL    12/10/2001  LAPSED    ---
SLAYER, JONES  LDL    12/12/2001  LAPSED    ---
SLAYER, JONES  LDL    12/16/2001  LAPSED    ON-TIME    
SLAYER, JONES  LDL    8/19/2002   LAPSED    ---
SLAYER, JONES  LDL    10/2/2002   LAPSED    ---
SLAYER, JONES  LDL    12/12/2002  LAPSED    ---
SLAYER, JONES  LDL    12/12/2002  LAPSED    ---
SLAYER, JONES  LDL    12/16/2002  LAPSED    EVENTUALLY
SLAYER, JONES  LDL    12/26/2002  COMP      ON-TIME
SLAYER, JONES  LDL    1/8/2004    LAPSED    NEVER