SQL Server - 选择行,删除重复但保留最高日期的行

时间:2013-05-26 17:02:09

标签: sql sql-server-2008 tsql

考虑SQL Server 2008中的以下数据库表:

ActionID (PK)    ActionType    ActionDate              UserID  ContentID
1                'Create'      '2013-05-26 18:40:00'   1       10
2                'Create'      '2013-05-26 18:30:00'   2       10
3                'Edit'        '2013-05-26 12:30:00'   5       12
4                'Edit'        '2013-05-26 12:25:00'   5       12
5                'Delete'      '2013-05-26 12:22:00'   6       12

我想编写一个按ContentIDActionType分组的SQL查询,但是返回的行包含最新的ActionDate,其他行被忽略,即使它们有不同的{{ 1}}或其他列值。

所以应该返回的是:

UserID

但我无法弄清楚如何编写查询来执行此操作。

2 个答案:

答案 0 :(得分:7)

一种方法是使用CTE(公用表表达式)。

使用此CTE,您可以按照某些条件对数据进行分区 - 即ContentIDActiontype - 并为每个“分区”提供SQL Server编号,所有行的起始位置为1,已订购由ActionDate

所以尝试这样的事情:

;WITH Actions AS
(
   SELECT 
       ActionID, ActionType, ActionDate, UserID, ContentID,
       RowNum = ROW_NUMBER() OVER(PARTITION BY ContentID, ActionType ORDER BY ActionDate DESC)
   FROM 
       dbo.YourTable
   WHERE
      ......
)
SELECT 
   ActionID, ActionType, ActionDate, UserID, ContentID,
FROM 
   Actions
WHERE
   RowNum = 1
ORDER BY 
   ActionDate DESC

这会接近你想要的吗?

答案 1 :(得分:3)

select t1.*
from Table1 t1
inner join (select ContentID, ActionType, max(ActionDate) as MaxDate
            from Table1
            group by ContentID, ActionType) t2
        on t1.ContentID = t2.ContentID
       and t1.ActionType = t2.ActionType
       and t1.ActionDate = t2.MaxDate;

如果您有{ContentID,ActionType}对的重复行,任何回答您问题的查询都可能产生意外结果。