我有一個包含重復記錄的表,我已經在其中創建了一個腳本來將重復記錄與原始記錄進行匯總,但是我無法洗掉重復記錄。
我正在嘗試這種方式:
DELETE FROM TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO
WHERE COD_PLANO_PAGAMENTO IN (SELECT MAX(COD_PLANO_PAGAMENTO) COD_PLANO_PAGAMENTO
FROM TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO
GROUP BY COD_PLANO_PAGAMENTO)
這個想法是取每個記錄的最后一條記錄COD_PLANO_PAGAMENTO并洗掉它,但是這樣所有記錄都被洗掉了,我做錯了什么?
該表的結構如下:

我需要洗掉,例如COD_MOVIMENTO = 405with的第二條記錄,每個COD_PLANO_PAGAMENTO = 9記錄應該只有一條COD_PLANO_PAGAMENTO不同的COD_MOVIMENTO
uj5u.com熱心網友回復:
您可以使用帶有行編號的可更新 CTE 來計算要洗掉的行。
您可能需要調整磁區和排序子句,目前尚不清楚您到底需要什么。
WITH cte AS (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY COD_MOVIMENTO, COD_PLANO_PAGAMENTO ORDER BY (SELECT 1)
FROM TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO mp
)
DELETE FROM cte
WHERE rn > 1;
uj5u.com熱心網友回復:
您的洗掉陳述句將采用 max() 但即使您只有一條記錄,它也會回傳一個值。
另請注意,您的 group by 應該在 COD_MOVIMENTO 上。
作為修復,請確保至少有兩個專案:
DELETE FROM TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO
WHERE COD_PLANO_PAGAMENTO IN
(SELECT MAX(COD_PLANO_PAGAMENTO)COD_PLANO_PAGAMENTO
FROM TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO
WHERE cod_plano_pagamento in
(select cod_plano_pagamento
from TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO
group by COD_PLANO_PAGAMENTO
having count(*) > 1)
GROUP BY COD_MOVIMENTO )
uj5u.com熱心網友回復:
在您的評論中,您希望洗掉具有相同 COD_MOVIMENTO、COD_PLANO_PAGAMENTO 和 VAL_TOTAL_APURADO 的重復行,試試這個:
delete f1 from
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY COD_MOVIMENTO, COD_PLANO_PAGAMENTO, VAL_TOTAL_APURADO ORDER BY COD_MOVIMENTO) rang
FROM TB_MOVIMENTO_PDV_DETALHE_PLANO_PAGAMENTO
) f1
where f1.rang>1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325099.html
標籤:sql sql-server 数据库
上一篇:Oraclesql-匯總折扣
下一篇:如何在兩個查詢結果之間執行邏輯與
