2009-10-20 84 views
0

我有以下問題:SQL更新值最高的日期表

假設我有一個具有以下字段的表: [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 

我想要做的是以下幾點:在所有的記錄,其中[狀態] =「開始」跑插入操作。

完成後,我不知道該怎麼做的部分如下:我想將[狀態日期]和[狀態]更新爲最終狀態日期的狀態。即我想要的是:

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

有什麼建議嗎?

[編輯]

我使用SQL Server 2008

隨着插入到我的意思是創建一個新表,並插入到它僅在具有狀態爲「啓動」的記錄,從而實現與表唯一的ID

+0

你是什麼意思,插入到狀態='開始'的所有記錄? – 2009-10-20 15:31:25

+0

你正在使用什麼數據庫,以及哪個版本? – 2009-10-20 15:36:49

+0

哈哈,似乎我造成了相當多的困惑,對不起人。所以讓我清楚一點:我選擇所有'開始'記錄並將它們轉儲到另一個表中,因此我有一個唯一ID表,我知道每個表的開始日期。然後我想要找到每個ID的記錄上的最後狀態日期,然後更新我的新唯一表中的記錄,以反映這 – Karl 2009-10-20 15:45:28

回答

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 

現在,你想要什麼表,此更新? 「在[狀態] ='開始'」的所有記錄上插入插入內容意味着什麼?你是否創建了第二個表並將這個日期插入它?

編輯:

好了,所以我想你想在這個新創建的表來更新數據呢?

試試這個(我希望我在這沒有語法錯誤,我沒有一個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

恕我直言,如果你需要澄清,你可以像以前一樣在評論中提問。謝謝! – 2009-10-20 15:34:56

0

我相信你只是想更新與所有結果Status =「Start」to Status =「Stop」AND [Status Date] = now()(now()或類似的數據庫)?

對不起,如果這聽起來不清楚,但我不確定你在問什麼。

+0

不完全。我想要的是從第4條記錄中選擇(在這種情況下)狀態日期和狀態(可以將其標識爲具有最新日期的記錄),然後使用這些值更新唯一記錄(參見上面的[編輯]) – Karl 2009-10-20 15:42:38

0

爲什麼你需要更新什麼?如果您可以根據數據確定哪個值具有最高的日期,則沒有理由存儲它。所有這些都會引入不一致的可能性......現在,每當單行被添加,更改或刪除時,您都需要更新所有內容。呸。

+0

我同意,但我只會這樣做一次。我正在將此數據集(以及其他格式不同的其他數據集)遷移到一個標準化文件中。這不是一個動態的過程。 – Karl 2009-11-12 07:39:14

0

這是做你想做的嗎?它爲每個具有開始狀態的記錄創建一個新記錄,並且僅當停止記錄當前不存在時才添加停止狀態。

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