有这样的表:
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。我想只留下最新的日期
答案 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