我有以下问题:
假设我有一个包含以下字段的表: [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的表
答案 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