考虑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
我想编写一个按ContentID
和ActionType
分组的SQL查询,但是返回的行包含最新的ActionDate
,其他行被忽略,即使它们有不同的{{ 1}}或其他列值。
所以应该返回的是:
UserID
但我无法弄清楚如何编写查询来执行此操作。
答案 0 :(得分:7)
一种方法是使用CTE(公用表表达式)。
使用此CTE,您可以按照某些条件对数据进行分区 - 即ContentID
和Actiontype
- 并为每个“分区”提供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}对的重复行,任何回答您问题的查询都可能产生意外结果。