唯一聊天记录 sql

unique chat records sql

我有 DB 其中有 5 列如下:

寻找 SQL 服务查询,我想根据以下限制从给定用户 ID 的两列 (user_id_senduser_id_rec) 中筛选结果:

SQL Query

这个查询的主要目的是获取user_id的记录,找出他给谁发过消息,从谁那里收到过消息。

我也附上了sheet供您参考。

这是我的尝试

WITH t 
     AS (SELECT * 
         FROM   messages 
         WHERE  user_id_sender = 1) 
SELECT DISTINCT user_id_reciever, 
                * 
FROM   t; 

WITH h 
     AS (SELECT * 
         FROM   messages 
         WHERE  user_id_reciever = 1) 
SELECT DISTINCT user_id_sender, 
                * 
FROM   h; 

select * from
(
select ROW_NUMBER() over (order by message_date DESC) as rowno,
* from messages
where user_id_receiver = 1
--order by message_date DESC
) T where T.rowno = 1
UNION ALL
select * from 
(
select ROW_NUMBER() over (order by message_date DESC) as rowno,
* from messages
where user_id_sender = 1
-- order by message_date DESC
) T where T.rowno = 1

解释:对于user_id_sender的每一组,内部按message_datedesc排序,然后加上行号,我们只要第一个(按时间顺序排在最后)。然后对 user_id_receiver 执行相同操作,并将结果合并在一起以获得包含所有所需行的 1 个结果集。然后,您可以根据需要在末尾添加自己的 order by 子句和其他 where 条件。

当然,这一次只适用于任意 1 个 user_id(将 =1 替换为 @user_id)。

同时从所有 user_id 中获取结果是一个完全不同的查询,希望这对您有所帮助?

;WITH tmpMsg AS (
SELECT M2.message_id
              ,M2.user_id_receiver
              ,M2.user_id_sender
              ,M2.message_date
              ,M2.message_details
              ,ROW_NUMBER() OVER (PARTITION BY     user_id_receiver+user_id_sender ORDER BY message_date DESC) AS 'RowNum'
          FROM messages M2
         WHERE M2.user_id_receiver = 1
            OR M2.user_id_sender = 1
)
SELECT T.message_id
      ,T.user_id_receiver
      ,T.user_id_sender
      ,T.message_date
      ,T.message_details
  FROM tmpMsg T
 WHERE RowNum <= 1  

当您查询特定的 user_id 时,上面应该会为您获取您正在寻找的结果(将 1 替换为参数,例如 @p_user_id)。 PARTITION 子句中的 user_id_receiver+user_id_sender 确保具有 user id 组合(例如 1 - 2、2 - 1)的记录不会被选择两次。

希望对您有所帮助。