唯一聊天记录 sql
unique chat records sql
我有 DB
其中有 5 列如下:
- message_id
- user_id_send
- user_id_rec
- message_date
- message_details
寻找 SQL 服务查询,我想根据以下限制从给定用户 ID 的两列 (user_id_send
、user_id_rec
) 中筛选结果:
- 获取最新记录(按日期或 message_id 筛选)
- 仅唯一记录(1 - 2 和 2 - 1 相同,因此只会返回一条记录,以最新记录为准)
- 根据message_id
降序排列
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)的记录不会被选择两次。
希望对您有所帮助。
我有 DB
其中有 5 列如下:
- message_id
- user_id_send
- user_id_rec
- message_date
- message_details
寻找 SQL 服务查询,我想根据以下限制从给定用户 ID 的两列 (user_id_send
、user_id_rec
) 中筛选结果:
- 获取最新记录(按日期或 message_id 筛选)
- 仅唯一记录(1 - 2 和 2 - 1 相同,因此只会返回一条记录,以最新记录为准)
- 根据message_id 降序排列
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)的记录不会被选择两次。
希望对您有所帮助。