SQL更新值到表中的最高日期

时间:2009-10-20 15:25:47

标签: sql-server tsql sql-server-2008

我有以下问题:

假设我有一个包含以下字段的表: [ID] [开始日期] [状态日期] [状态描述]

[ID]不是唯一的,所以我可能有:

ID  Start Date   Status Date      Status
123 01/01/2009  01/01/2009       Start
123 01/01/2009  01/02/2009       Change
123 01/01/2009  01/03/2009       Change
123 01/01/2009  01/07/2009       Stop

我想要做的是:在[Status] ='Start'的所有记录上运行插入。

完成后,我不知道该怎么办的部分如下:我想将[状态日期]和[状态]更新为最终状态日期。即我想要的是:

ID  Start Date   Status Date      Status
123 01/01/2009  01/07/2009       Stop

有什么建议吗?

[编辑]

我正在使用SQL Server 2008

使用insert into我的意思是创建一个新表并仅将那些状态为“Start”的记录插入其中,从而实现具有唯一ID的表

4 个答案:

答案 0 :(得分:1)

我不确定我是否得到你的权利。您想要任何ID的最新日期和状态吗?

那将是:

SELECT    a.ID, a.StatusDate, a.Status
FROM      Table AS a
INNER JOIN 
(
    SELECT   ID, Max(StatusDate) AS StatusDate
    FROM     Table
    GROUP BY ID
) AS b
ON        a.ID = b.ID
AND       a.StatusDate = b.StatusDate

现在,您要用此更新哪个表?你是什​​么意思“在[Status] ='Start'”的所有记录上运行插入?您是否创建了第二个表并将此日期插入其中?

编辑:

好的,我想你想更新这个新创建的表中的数据呢?

试试这个(我希望我没有语法错误,我现在没有SQL服务器来试试):

UPDATE    c
SET       c.StatusDate = a.StatusDate,
          c.Status = a.Status
FROM      NewTable AS c
INNER JOIN Table AS a
ON        c.ID = a.ID
INNER JOIN 
(
    SELECT   ID, Max(StatusDate) AS StatusDate
    FROM     Table
    GROUP BY ID
) AS b
ON        a.ID = b.ID
AND       a.StatusDate = b.StatusDate

答案 1 :(得分:0)

我认为您只想将所有结果更新为Status =“Start”到Status =“Stop”和[Status Date] = now()(now()或类似的东西,具体取决于数据库)?

很抱歉,如果这听起来不清楚,但我不确定你在问什么。

答案 2 :(得分:0)

为什么需要更新?如果您可以从数据中确定哪个值具有最高日期,则没有理由存储它。所有这一切都引入了不一致的可能性......现在,您需要在每次添加,更改或删除单行时更新所有内容。呸。

答案 3 :(得分:0)

这样做你想要的吗?它为状态为start的每条记录创建一条新记录,并添加一个停止状态,但仅限于当前不存在停止记录。

Insert into my table (ID  Start Date   Status Date      Status)
select ID  Start Date   Status Date      'Stop'
From mytable  mt 
left join mytable mt2 on mt.id = mt2.id and mt2.status = 'stop'
where mt.status = 'Start'
and mt2.id is null