是否可以删除所有其他行但保留其中包含最早日期的行?
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
的行由于
艾登
答案 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。
如果您只需要对这两项操作进行一次查询,那么我认为不可能。