我花了 6 個小時來解決這個問題,但我仍然找不到解決方案,這是表格:
我使用 row_number(),CTE 也無法解決這個問題。我只是想用舊資料洗掉重復的日期并保留最新資料,如果我洗掉count>1和row_number>1,我無法保留新資料,請幫忙。
我在下面嘗試過,但它使我的資料全部被洗掉:
delete from aaa where date in (select date from (select *,row_number() over (partition by date order by date) as rn from aaa)t where rn=1);
uj5u.com熱心網友回復:
困難在于您的資料完全相同。沒有什么可以將任何其他記錄與下一個記錄區分開來。如果您有更多未在此處顯示的列,則會打開一些當前無法使用您在此處發布的資料集的附加選項。有幾個選擇。
- 向每一行添加一個主鍵(或最后一個運行索引),以便有一些東西可以區分一個條目和下一個條目。
- 將不同的結果選擇到臨時表中。從現有表中洗掉所有內容。然后將臨時表中的所有內容重新插入現有表中。然后洗掉您的臨時表。在單個事務中執行洗掉和插入操作,以免表暫時為空且對其他事務可見(如果我們假設您的其他并行事務只會讀取已提交的資料)。
如果您實際上有更多列,那么您可以分組并從附加列中選擇 min() 值以幫助您區分它們。然后洗掉不屬于該資料集的所有內容(重復記錄 最小值(column_that_shows_a_difference)。
但是,您確實應該向您的表添加一個主鍵(即使它只是一個自動生成的標識列,并未反映在您的應用程式資料模型中)。當您有一個業務密鑰告訴您某事是(或應該是)唯一的,那么您應該另外創建一個唯一約束。
uj5u.com熱心網友回復:
您可以嘗試使用基于 subqoery 的洗掉與連接來匹配最大日期
delete aaa
from aaa
inner join (
select aaa.ticker, date
from aaa
left join (
select aaa.ticker, max(date) as max_date
from aaa
group by ticker
) t on aaa.ticker = t.ticker and aaa.date = t.max_date
where t.max_date is null
) t2 on t2.ticker = aaa.ticker
and t2.date = aaa.date
uj5u.com熱心網友回復:
我認為這是添加主鍵以自動遞增并執行以下代碼的唯一解決方案:
delete t1
from aaa t1
inner join aaa t2
where t1.id < t2.id and t1.date = t2.date;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411779.html
標籤:
