Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从按其他ID分组的表中选择最近(前1个)_Sql_Sql Server 2008 - Fatal编程技术网

Sql 从按其他ID分组的表中选择最近(前1个)

Sql 从按其他ID分组的表中选择最近(前1个),sql,sql-server-2008,Sql,Sql Server 2008,我有一个表,其中包含与用户之间的消息。如何使用SQL选择用户发送的所有消息。我想按MessageSenderUserID对结果进行分组。我还想只返回每个收件人最近的邮件 我试图在having子句中使用MAX,但这似乎不是正确的解决方案 我最好将其描述为以下问题的组合: SELECT TOP 1 MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID FROM [Messaging_Message] WHERE Mes

我有一个表,其中包含与用户之间的消息。如何使用SQL选择用户发送的所有消息。我想按MessageSenderUserID对结果进行分组。我还想只返回每个收件人最近的邮件

我试图在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

谢谢

这假设用户不能在同一时间发送多条消息(在这种情况下,会为用户显示多条消息):


我最近才学会了一种(最令人惊讶和有趣的)获得小组第一名的方法:

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
返回所有的。哦,应用机械的快乐

你能发布一些示例数据和所需的o/p吗?这太棒了,但为什么我做不到:“从[Messaging_Message]ORDER BY MessageSent中选择带有联系的top 1 MessageID、MessageSenderUserID、MessageRecipientUserID…”@Nikola Markovinović,因为MessageSent对于不同的MessageSenderUserID有不同的值。row_number()为发送的每个最顶端的消息分配1,按降序将ATE转换为它们的位置,然后,具有关系的top 1只选择row_number=1的行。这是一个特例,你甚至不能说选择前2名。。。它仅适用于每个组的最高值。如果我在with语句中的select上放置where子句以区分每个用户,然后让并发用户访问,我会有问题吗?我不熟悉临时结果集
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
select top 1 with ties
    MessageID, 
    MessageSent, 
    MessageSenderUserID, 
    MessageRecipientUserID
from [Messaging_Message]
order by row_number() over (partition by MessageSenderUserID 
                            order by MessageSent desc)