我很難從資料庫中洗掉重復項。它是 MariaDB(協議版本:10、10.3.34-MariaDB Server)。我需要洗掉三列相等的行。我試圖使用 WITH 子句,但資料庫拋出無法識別“WITH”的錯誤,所以我專注于傳統方式。
我需要洗掉foreignId和相等的column1行。column2
我正在檢查是否有重復
SELECT foreignId, column1, column2, COUNT(*)
FROM table1
GROUP BY foreignId, column1, column2
HAVING COUNT(*) > 1
正在嘗試洗掉重復項...
DELETE table1
FROM table1
INNER JOIN (
SELECT
p.id,
p.foreignId,
p.column1,
p.column2,
ROW_NUMBER() OVER (
PARTITION BY
p.column1,
p.column2,
p.foreignId
ORDER BY
p.foreignId,
p.column2,
p.column1
) AS row_number
FROM table1 p
GROUP BY p.foreignId, p.column1, p.column2
) dup
ON table1.column1 = dup.column1
WHERE dup.row_number > 1;
我正在修改這段代碼,但仍然無法按預期作業......我做錯了什么?
uj5u.com熱心網友回復:
您的查詢存在一些問題:
- 您需要洗掉
GROUP BY子查詢中的 - 您應該將
ORDER BYinOVER子句更改為(時間戳列的名稱在ORDER BY p.ts DESC哪里)ts - 您需要
JOIN在唯一id列上;否則,您將洗掉任何具有在任何地方重復的值的行,即ON table.id = dup.id
這會給你:
DELETE table1
FROM table1
INNER JOIN (
SELECT
p.id,
ROW_NUMBER() OVER (
PARTITION BY
p.column1,
p.column2,
p.foreignId
ORDER BY
p.ttimestamp DESC
) AS rn
FROM table1 p
) dup
ON table1.id = dup.id
WHERE dup.rn > 1
注意我不會row_number用作列別名,因為它是保留字,所以我已將其更改為rn上面。
dbfiddle 上的演示(感謝@JonasMetzler )
請注意,如果重復行也可能具有相同的時間戳值,則此查詢將洗掉這些行的隨機選擇。如果您想要確定性結果,請將ORDER BY子句更改為
ORDER BY
p.ttimestamp DESC,
p.id DESC
這將保留具有最高(或最低,如果你洗掉DESCafter p.id)id值的行。
dbfiddle 上的演示
uj5u.com熱心網友回復:
假設您有一個像 id 這樣的唯一列,您可以執行以下操作:
DELETE FROM table1 WHERE ID NOT IN
(SELECT x.id FROM
(SELECT MAX(id) id, MAX(foreignId) foreignId,
MAX(column1) column1, MAX(column2) column2
FROM table1
WHERE ttimestamp IN (SELECT MAX(ttimestamp) FROM table1
GROUP BY foreignID, column1, column2)
GROUP BY foreignId, column1, column2)x);
請在此處查看作業示例:db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/460670.html
上一篇:這個創建表查詢的語法有什么問題?
下一篇:月差SQL查詢
