4

考虑 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

我想编写一个 SQL 查询,该查询按ContentID和分组,ActionTypeActionDate返回最新的行并忽略其他行,即使它们具有不同UserID或其他列值。

所以它应该返回的是:

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

但我不太清楚如何编写查询来做到这一点。

4

2 回答 2

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

这是否接近你正在寻找的东西?

于 2013-05-26T17:04:52.810 回答
4
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} 对有重复的行,任何回答您问题的查询都可能产生意外结果。

于 2013-05-26T17:11:09.923 回答