删除带日期检查的行

时间:2014-02-03 08:56:23

标签: sql sql-server tsql stored-procedures

有这样的表:

   user_id              Date                Status
    1000        2013-04-02 11:46:10.000       IN
    1001        2013-04-02 11:50:08.000       OUT
    1005        2013-04-02 11:46:24.000       IN
    1005        2013-04-02 12:50:04.000       OUT
    1005        2013-04-02 12:50:10.000       OUT
    1045        2013-04-02 14:46:05.000       IN

要删除一个用户的状态IN或OUT为两次的删除日期。 例如,它必须删除user_id 1005,其中日期为2013-04-02 12:50:04.000。我想只留下最新的日期

3 个答案:

答案 0 :(得分:3)

您可以使用CTE + ROW_NUMBER

WITH CTE AS
(
    SELECT user_id, Date, Status,
        RN = ROW_NUMBER () OVER (PARTITION BY user_id, Status
                                 ORDER BY Date DESC)
    FROM dbo.TableName
)
DELETE FROM CTE
WHERE RN > 1

您可以使用SELECT * FROM查看要删除的内容。

以下是您的示例数据的 Demo

答案 1 :(得分:1)

这个答案也适用于旧版本的mssql

delete t
from 
table t
where exists(select 1 from table 
             where t.user_id = user_id 
               and t.status = status
               and t.date < date)

这个答案的弱点是,如果你有一个具有相同时间戳的senario,相同的user_id和2行的相同日期,它将保持两行完整

答案 2 :(得分:0)

另一种方法是删除重复的记录,以防你有一个我称为“id”的表的主键:

delete b
from TableName a
inner join TableName b on a.user_id=b.user_id
where a.Date=b.Date and a.Status=b.Status and a.id>b.id