简体   繁体   English

Select 来自按另一个 ID 分组的表的最新(前 1)

[英]Select most recent (top 1) from table grouped by another ID

I have a table that contains messages to and from users.我有一个表,其中包含用户发送的消息和来自用户的消息。 How can I use SQL to select all of the messages that the user sent.我如何使用 SQL 到 select 用户发送的所有消息。 I want to group the results by MessageSenderUserID.我想按 MessageSenderUserID 对结果进行分组。 I also want to return only the most recent per recipient.我还想只返回每个收件人的最新消息。

I tried to use MAX in a having clause, but it seems that's not the correct solution.我试图在 having 子句中使用 MAX,但似乎这不是正确的解决方案。

I may best describe it as a combination of the following queries:我最好将其描述为以下查询的组合:

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

Thanks!谢谢!

I've only recently learned this (most surprising & fun) way of getting top 1 item in a group:我最近才学会这种(最令人惊讶和有趣的)方法来获得组中的前 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)

Trick is in order by - results are grouped in partition by part and ordered by sort key, resulting in each group receiving number 1 for first row.技巧按顺序排列 - 结果按部分分组并按排序键排序,导致每个组的第一行接收数字 1。 With ties returns all ones. With ties返回所有。 Oh joy of applied mechanic!哦,应用机械师的快乐!

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

This assumes that a user can't send more than one message at the exact same time (it would show more than one message for a user in that case):这假设用户不能同时发送多条消息(在这种情况下,它会为用户显示多条消息):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM