我看到之前有人问过一些问题,但答案对这个案例不起作用。
表用户
身份证 | 姓名 |
---|---|
1 | A |
2 | B |
3 | C |
Chat
表包含像这样的双日志消息,其中第1面来自发送者视角,第2面来自接收者视角:
身份证 | 发件人ID | 接收者ID | 留言 | 侧面 | 创建日期 |
---|---|---|---|---|---|
34c1de57-11ba-4d34-b5a3-9e6a5511223b | 1 | 2 | 你好 | 1 | 2015-12-08 20:00 |
3c2c8aae-fd08-4879-96fb-6ac1c75d6b28 | 2 | 1 | 你好 | 2 | 2015-12-08 20:01 |
60f91e53-7b8c-4cac-a394-e613fe39bcef | 3 | 1 | 谢谢 | 1 | 2015-12-09 20:00 |
d74fa5f0-eb2c-4c32-9066-80e11e6160b9 | 1 | 3 | 谢谢 | 2 | 2015-12-09 20:01 |
给定一个用户 ID(即:1),我需要结果如下所示:
姓名 | 侧面 | 留言 |
---|---|---|
C | 2 | 谢谢 |
B | 1 | 你好 |
我该怎么做?
问题文本和示例结果之间存在冲突。
问题文本表示显示每个对话中最新 ID 的行。但示例结果优先考虑 ID 是发件人的情况。
如果样本结果正确,您想要这个:
WITH numbered As
(
SELECT *
, row_number() over (partition by SenderId, RecieverId order by CreatedDate Desc) rn
FROM Chat
WHERE SenderId = @Id
)
SELECT U.Name, n.Side, n.Message
FROM numbered n
INNER JOIN User u ON u.Id = n.ReceieverId
如果问题文本正确,您想要这个:
WITH numbered as (
select *,
case when senderId = @id then ReceiverId else senderId end PartnerId,
row_number() over (partition by least(senderId, receiverId), greatest(senderId, receiverId) order by createdDate desc) rn
from Chat
where @Id IN (senderId, receiverId)
)
SELECT u.Name, n.Side, n.Message
FROM numbered n
INNER JOIN User u on u.Id = n.PartnerId
WHERE n.rn = 1