SQL Server从表中删除行,使记录保留Max CreationDate

时间:2017-01-20 10:11:41

标签: sql sql-server

我想根据创建日期从表中删除旧记录,留下最新记录

尝试过SQL,但没有用。

 SELECT *
 --DELETE L
 FROM ItemPriceListMap L
 LEFT JOIN (
 SELECT ItemPriceListUID3,MAX(CAST(CreationDate as DATE)) MaxDate
 FROM ItemPriceListMap
 GROUP BY ItemPriceListUID3
 )M ON L.ItemPriceListUID3 = M.ItemPriceListUID3 AND CAST(L.CreationDate as DATE) = M.MaxDate
 WHERE M.ItemPriceListUID3 IS NULL 

映射视图

SELECT I.Description,ipl.UnitListPrice1,iplmp.VatMRP,iplmp.CreationDate FROM ItemPriceListMap iplmp
INNER JOIN ItemPriceList ipl ON iplmp.ItemPriceListUID3 = ipl.UID
INNER JOIN Item i ON ipl.ItemUID = i.UID
ORDER BY I.Description,iplmp.CreationDate

enter image description here

编辑:

更多示例数据enter image description here 使用此SQL

SELECT I.Description,iplmp.ItemPriceListUID3,iplmp.CreationDate FROM ItemPriceListMap iplmp
INNER JOIN ItemPriceList ipl ON iplmp.ItemPriceListUID3 = ipl.UID
INNER JOIN Item i ON ipl.ItemUID = i.UID
ORDER BY I.Description,iplmp.CreationDate

所以执行删除命令后,突出显示的行应该保留在表格中(黄色),蓝色突出显示的是相同的项目

3 个答案:

答案 0 :(得分:0)

试试这个:

DELETE L
FROM ItemPriceListMap L
WHERE CreationDate <> (SELECT MAX(CreationDate) MaxDate 
                       FROM ItemPriceListMap LL
                       WHERE L.ItemPriceListUID3 = LL.ItemPriceListUID3)

注意:首先备份您的数据。

答案 1 :(得分:0)

使用CTE和row_number

with CTE as
(
select a1.*, row_number() over(
                               partition by ItemPriceListUID3  -- remove this if you don't need the grouping
                               order by CreationDate desc) as R_ORD
from ItemPriceListMap a1
)
delete
from CTE
where R_ORD > 1

答案 2 :(得分:0)

尝试:您可以通过执行下面的一些简单更改来使用您自己的查询,您必须以<>加入max date,这样就不会删除记录,仅删除与ItemPriceListUID3 and <> MaxDate

匹配的其他记录
 SELECT *
 --DELETE L
 FROM ItemPriceListMap L
 INNER JOIN (SELECT MAX(CAST(CreationDate as DATE)) MaxDate
            FROM ItemPriceListMap
            ) M ON CAST(L.CreationDate as DATE) <> M.MaxDate