0

我想从表中删除任何重复的记录,并保留最新的记录(根据日期)。在下面的示例中,将删除第一条记录 (hdate = 2012-07-01, id = 16)。

使用 SQL Server 2008

谢谢

hdate      id           secId       pricesource          price         
---------- ------------ ----------- -------------------- --------------
2012-07-01 16           126         DFLT                 NULL          
2012-07-02 16           126         DFLT                 NULL          
2012-07-01 CAD          20          DFLT                 1             
2012-07-01 TWD          99          DFLT                 1   
4

3 回答 3

2

使用 Sql-Server 2005 或更高版本,您可以在 a 中使用ROW_NUMBER适当OVERCTE

WITH CTE AS
(
  SELECT hdate, id, secId, pricesource, price,
  ROW_NUMBER() OVER (PARTITION BY id, secId, pricesource, price ORDER BY hdate DESC) AS RN
  FROM dbo.TableName t
)
DELETE FROM CTE WHERE RN > 1

这是一个 Sql-Fiddle 演示

于 2012-11-16T15:31:39.670 回答
0

如果您的 RDBMS 不支持 CTE,或者无法从中删除(因为您没有列出您正在使用的内容),那么这里是其他所有内容的版本:

DELETE FROM TableName as a
WHERE EXISTS (SELECT '1'
              FROM TableName b
              WHERE b.id = a.id  -- Plus all other 'duplicate' columns
                    AND b.hdate > a.hdate);

(还有 Tim 修改过的Fiddle 演示——尽管由于某种原因这不适用于 SQL Server)。

于 2012-11-16T17:23:46.687 回答
0

这不像 Tim 的解决方案那样优雅,但不需要 CTE。它还处理列中的空值作为等效项。

DELETE
FROM MyTable m1
WHERE EXISTS (
    SELECT 1
    FROM MyTable m2
    WHERE 
        (m2.id = m1.id OR (m2.id IS NULL AND m1.id IS NULL))
    AND (m2.secId = m1.secId OR (m2.secId IS NULL AND m1.secId IS NULL))
    AND (m2.pricesource = m1.pricesource OR (m2.pricesource IS NULL AND m1.pricesource IS NULL))
    AND (m2.price = m1.price  OR (m2.price IS NULL AND m1.price IS NULL))
    AND m2.hdate > m1.hdate
);
于 2012-11-16T17:35:38.850 回答