使用最近的日期并删除其他SQL

时间:2016-11-11 18:32:13

标签: sql sql-server

是否可以删除所有其他行但保留其中包含最早日期的行?

E.g。

 Person

 ID         Name         Birthdate

1            A            20160101
2            B            20160202
3            C            20160303

是否有任何查询返回带有OLDEST birthdate的人行ID,并删除所有其他行

 returns 3 and deletes all other rows

如果所有生日都是SAME日期,那么请返回最低ID

的行

由于

艾登

2 个答案:

答案 0 :(得分:1)

如果您使用ROW_NUMBER,它将帮助您更正确地识别您想要的记录,因为Birthdate可能具有联系。因此,构建一个公用表表达式[CTE],用于标识您要查找的行。然后,如果你真的想要从cte中删除数据库中的记录,但是如果你只想返回而不是修改数据(更有可能),只需选择行号为1的位置。

DECLARE @Table AS TABLE (ID INT, Name CHAR(1), Birthdate DATE)
INSERT INTO @Table VALUES
(1,'A','2016/01/01')
,(2,'B','2016/02/02')
,(3,'C','2016/03/03')
,(4,'D','2016/01/01') --note this is a tie for oldest birthdate

;WITH cte AS (
SELECT
    *
    ,ROW_NUMBER() OVER (ORDER BY Birthdate, Id) as RowNumber
FROM
    @Table
)

因此,如果你真的想要修改/删除数据,你可以在上面的代码之后立即执行以下操作:

DELETE FROM cte WHERE RowNumber > 1

SELECT * FROM @Table

如果您真的只想要符合条件的1行,您只需将此语句放在上述CTE之后。

SELECT * FROM cte WHERE RowNumber = 1

答案 1 :(得分:0)

当然,如果删除你的意思是从数据库中删除记录,那么RETURN意味着选择一行,如果你可以使用一批两个查询,你可以这样做:

DELETE Person
WHERE ID <> (
    SELECT TOP 1 ID
    FROM Person
    ORDER BY Birthdate DESC, ID
);

SELECT TOP 1 ID
FROM Person;

最后为Id ASC订购子查询保证,如果有相同的出生日期,则只返回最低的ID。
最后的SELECT将返回唯一的剩余Person。

如果您只需要对这两项操作进行一次查询,那么我认为不可能。