2012-04-03 100 views
2

我有一个包含用户消息的表。我如何使用SQL来选择用户发送的所有消息。我想通过MessageSenderUserID对结果进行分组。我也想只返回最近的每个收件人。从另一个ID分组中选择最近的(前1个)

我试图在having子句中使用MAX,但似乎这不是正确的解决方案。

我可能最好将其描述为以下查询的组合:

SELECT TOP 1 MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID 
FROM [Messaging_Message] 
WHERE MessageSenderUserID = 799 
ORDER BY MessageSent DESC 

SELECT MessageSenderUserID 
FROM [Messaging_Message] 
GROUP BY MessageSenderUserID 

谢谢!

+1

你可以张贴一些示例数据和所需的O/P – Teja 2012-04-03 21:04:30

回答

5

我VE最近才知道这个(最令人惊讶的&乐趣)获得一组前1项的方式:

select top 1 with ties 
    MessageID, 
    MessageSent, 
    MessageSenderUserID, 
    MessageRecipientUserID 
from [Messaging_Message] 
order by row_number() over (partition by MessageSenderUserID 
          order by MessageSent desc) 

诀窍是为了通过 - 结果是通过参加分区分组和排序关键字排序,导致每个组接收编号为1的第一行。 With ties返回所有的。哦应用技工的喜悦!

+0

这是真棒,但怎么来的,我不能做的事:“选择顶部1与领带 的MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID 从[Messaging_Message] ORDER BY MessageSent ... '@NikolaMarkovinović – Hoppe 2012-04-04 13:10:09

+1

因为MessageSent对于不同的MessageSenderUserID具有不同的值。 ROW_NUMBER()指定1到每个最上面MessageSent,由递减顺序翻译成茨自己的位置,然后登顶1的关系,选择具有ROW_NUMBER = 1,这是一个特殊的情况下,你甚至不能说选择顶部2 ......它只能行仅限每组最高价值。 – 2012-04-04 13:23:18

0

这假设用户不能在完全相同的时间发送多个消息(它会显示在这种情况下,用户不止一个消息):

SELECT a.MessageID, a.MessageSent, a.MessageSenderUserID, a.MessageRecipientUserID 
FROM Messaging_Message AS a 
    JOIN (
     SELECT MessageSenderUserID, MAX(MessageSent) AS MessageSent 
     FROM Messaging_Message 
     GROUP BY MessageSenderUserID 
    ) AS b ON a.MessageSenderUserID = b.MessageSenderUserID 
     AND a.MessageSent = b.MessageSent 
1
WITH TestTableCTE AS 
(
    SELECT RN = ROW_NUMBER() OVER(PARTITION BY MessageSenderUserID ORDER BY MessageSent DESC), 
      MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID 
    FROM [Messaging_Message] 
) 

SELECT MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID FROM TestTableCTE WHERE RN=1 
+0

如果我把where子句的选择中with语句每个用户进行区分,然后有并发用户访问,我将有问题?我是新来的临时结果集 – Hoppe 2012-04-04 13:21:00