简体   繁体   English

PostgreSQL select 由两列区分

[英]PostgreSQL select distinct by two columns

I have a table我有一张桌子

senderId发件人ID receiverId接收者 ID date日期
1 1 2 2 "2022-08-10T07:21:12.881Z" “2022-08-10T07:21:12.881Z”
2 2 1 1 "2022-08-10T07:28:12.881Z" “2022-08-10T07:28:12.881Z”
2 2 1 1 "2022-08-10T07:22:12.881Z" “2022-08-10T07:22:12.881Z”
1 1 2 2 "2022-08-10T07:25:12.881Z" “2022-08-10T07:25:12.881Z”

Current query当前查询

SELECT DISTINCT ON ("senderId", "receiverId") "sender"."id" AS "senderId", "receiver"."id" AS "receiverId", cm."createdAt" AS "createdAt" FROM "chat_message" "cm" LEFT JOIN "user" "sender" ON "sender"."id"="cm"."senderId"  LEFT JOIN "user" "receiver" ON "receiver"."id"="cm"."receiverId" WHERE "senderId" = 2 OR "receiverId" = 2 ORDER BY "senderId", "receiverId" ASC, cm."createdAt" DESC

Current result当前结果

senderId发件人ID receiverId接收者 ID date日期
1 1 2 2 "2022-08-10T07:25:12.881Z" “2022-08-10T07:25:12.881Z”
2 2 1 1 "2022-08-10T07:28:12.881Z" “2022-08-10T07:28:12.881Z”

Expected result预期结果

senderId发件人ID receiverId接收者 ID date日期
2 2 1 1 "2022-08-10T07:28:12.881Z" “2022-08-10T07:28:12.881Z”

So, I need to select only one row in this pair where the date is bigger所以,我只需要 select 这对中日期较大的一行

We can use a LEAST / GREATEST trick here along with DISTINCT ON :我们可以在这里使用LEAST / GREATEST技巧和DISTINCT ON

SELECT DISTINCT ON (LEAST(senderId, receiverId),
                    GREATEST(senderId, receiverId))
       LEAST(senderId, receiverId) AS senderId,
       GREATEST(senderId, receiverId) AS receiverId,
       createdAt
FROM chat_message
ORDER BY 1, 2, createdAt DESC;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM