问题描述
我正在开发基于 API 的简单聊天模块。我正在尝试为特定用户获取聊天对话,但由于具有相同值的 2 列彼此交换导致我的数据被复制。
我想合并具有相同值的行在 2 列之间交换,并且合并行应基于插入到数据库中的最新条目。
数据如下:
Id To From Message ConversationTime
1 1 2 hello 11:00AM
2 3 1 hi 12:00PM
3 1 3 how are you? 12:15PM
4 3 1 I am fine. 12:30PM
5 4 5 Hi! 04:30PM
6 5 4 Hello 04:35PM
7 1 5 Hola! 06:30PM
例如,如果用户 ID 为 1,我的结果需要如下所示:
Id To From Message ConversationTime
1 1 2 hello 11:00AM
4 3 1 I am fine. 12:30PM
7 1 5 Hola! 06:30PM
如果 Id 是 5,那么结果将是这样的:
Id To From Message ConversationTime
6 5 4 Hello 04:35PM
7 1 5 Hola! 06:30PM
我的结果集如下所示:
Id To From Message ConversationTime
1 1 2 hello 11:00AM
3 1 3 how are you? 12:15PM
4 3 1 I am fine. 12:30PM
7 1 5 Hola! 06:30PM
任何帮助将不胜感激。提前致谢!
解决方法
想法是与链接的副本Get top 1 row of each group 相同;只需使用 CASE
表达式来获取 other 用户的 ID:
DECLARE @ID int = 1;
WITH RNs AS(
SELECT ID,[To],--TO is a reserved keyword and should not be used for object names
[From],--FROM is a reserved keyword and should not be used for object names
Message,ConversationTime,--I assume this is a time
ROW_NUMBER() OVER (PARTITION BY CASE [To] WHEN @ID THEN [From] ELSE [To] END ORDER BY ConversationTime DESC) AS RN --TO and FROM are reserved keywords and should not be used for object names
FROM dbo.YourTable
WHERE @ID IN ([To],[From])) --TO and FROM are reserved keywords and should not be used for object names
SELECT ID,--TO is a reserved keyword and should not be used for object names
[From],--FROM is a reserved keyword and should not be used for object names
Message,ConversationTime --I assume this is a time
FROM RN
WHERE RN = 1;
,
SQL Server 允许您在不使用 case
表达式的情况下通过反透视数据然后使用窗口函数来执行此操作:
select t.*
from (select t.*,row_number() over (partition by v.user_other order by t.conversationTime desc) as seqnum
from t cross apply
(values (t.to,t.from),(t.from,to.to)
) v(user,user_other)
where v.user = 1
) t
where seqnum = 1;