2013-07-31 149 views
0

我在一個postgres數據庫中有一個非常大的數據集合,我希望在特定的時間內保存數據...但是我做的是而不是想要它從任何給定的位置獲得最新的迭代數據&現場組合。SQL:只有在沒有較新的匹配記錄時才刪除舊記錄?

基本上,我已經得到了有location (bigint)site (bigint)readdate (bigint),和一點點伴隨數據(注意一個非常大的表:會有一個給定地點,位置和readdate多個條目 - 但對任何事相同的readdate被認爲是同一次掃描的一部分,並且需要保留給定的位置)。

目前,我剛剛設置了擺脫所有舊記錄...但存在的可能性,一個特定的網站和位置組合將停止發佈數據一段時間,我想保留最後的狀態如果發生的話。我在做PHP的SQL查詢,所以我很確定我可以一起竊取一些非常難看的代碼,它們爲任何給定的站點&位置組合找到最新的readdate,然後刪除比那個位置更新的東西,或者刪除基於日曆限制(以較低日期爲準),但我更願意將決策工作負載放在SQL查詢中,而不必首先獲取所有位置,站點和max(readdate)條目的列表,然後在php中進行遍歷,從而製作單個刪除查詢。

$query="DELETE FROM votwdata WHERE readdate < '".$limit."';"; 
  • 任何想法,良好的修訂:

    我當前的查詢(這並不做我想做的,因爲它之前$限制刪除的所有內容)是由申報?

+0

我不清楚在什麼條件下你想保存記錄......你可以給一個樣本記錄的例子或打破這個問題,使其更具可讀性嗎? – vanamerongen

+0

然後在sqlfiddle上發佈圖表,以便更容易回答。 –

+0

這很難讀。請參考SO [編輯工具](http://stackoverflow.com/editing-help)和[PostgreSQL的信息頁](http://stackoverflow.com/tags/postgresql/info),並改進你的問題。 –

回答

1

如果我明白你要做什麼,你有一些可能相同的字段,並且你想保留最近的記錄。假設您在每條記錄上都有一個順序ID或一個created_at,可以運行子查詢來標識要刪除的記錄。例如:

通過data1,data2從表組中選擇max(id),data1,data2;

這將拉出唯一data1和data2的最新記錄。您可以將它作爲內聯查詢運行,並將其連接回原始表。 (從表組中選擇max(id)「id」,data1,data2 by data1,data2)t2 其中t.id = t2.id;其中t.id = t2.id;

這會給你最近的記錄。您可以執行左連接,並查看空值以刪除您不喜歡的任何內容。

從表t選擇t.id,t2.id left join(從表組中選擇max(id)「id」,data1,data2 2,3)t2 on t.id = t2.id t2.id爲空;

這會給你所有你想刪除的記錄。

好吧,這是骯髒的方式 - 重構。

相關問題