SQL从一个表中选择多个不同的记录

Adn*_*KEN 1 sql t-sql sql-server sql-server-2008-r2 greatest-n-per-group

我有一张表如下

ID  |FromId |ToId   |Message|DateTime
------------------------------------------
1   |1      |2      |a      |15:00
2   |1      |2      |b      |15:01
3   |1      |2      |c      |15:02
4   |2      |1      |d      |15:03
5   |3      |1      |e      |15:04
6   |3      |1      |f      |15:05
7   |1      |3      |g      |15:06
Run Code Online (Sandbox Code Playgroud)

我想要得到的是Peers的最后一条消息.

例如:用户1和用户2有4条消息(ID:1,2,3,4),用户1和用户3有3条消息(ID:5,6,7)

我想从用户那里得到最新的Message记录,我需要一个SQL查询,它会得到如下结果:

*sql code here ? -- I need this.
Run Code Online (Sandbox Code Playgroud)

结果(对于:UserID = 1):

ID  |FromId |ToId   |Message|DateTime
------------------------------------------
4   |2      |1      |d      |15:03
7   |1      |3      |g      |15:06
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?我尝试过Distinct等,但它没有以某种方式工作.请帮忙.

对不起伙计我想我忘了提到我需要Peer的最新记录,而不是一个用户的最新记录,例如用户1和用户2我需要他们的最新记录,没有其中一个来自哪个或哪一个To To ..我需要两个最新的记录,在我们的案例中没有其他记录.

Nik*_*vić 6

如果是Sql Server 2005+,您可以使用row_number()over(...)来对记录进行分组,排序和编号,然后仅检索其组中的第一个记录:

; with cte as
(
  select *,
      -- Group by user not being searched for
         row_number() over (partition by case when FromID = @UserID
                                              then ToID
                                              else FromID
                                          end
      -- Last date will be numbered as 1
                            order by [DateTime] desc
                           ) rn
    from Table1
-- Filter only messages sent from or received by certain user
   where (FromID = @UserID or ToID = @UserID)
)
select *
  from cte
-- Get last dates only
 where rn = 1
Run Code Online (Sandbox Code Playgroud)