我正在聊天,我需要对我的数据库进行查询,在该数据库中,我要携带用户从与他写信的每个人处收到的最后一条消息,该查询应基于日期,最后一条消息应基于到日期为止
表格如下
# I can get all iris data from postresql database to R with no problem
test <- dbGetQuery(con, 'SELECT * from iris')
# Here I run into an error
test1 <- dbGetQuery(conSac, 'SELECT * from 20190502')
我需要执行后查询将以以下方式显示给我:
id id_destination message sender date
1 1123 hi 1133 18/06/2019
2 1123 bye 1133 17/06/2019
3 1123 ok 1144 18/06/2019
4 1123 hi 1144 17/06/2019
答案 0 :(得分:0)
尝试使用density_rank()
slect * from
(select *,dense_rank()over(partition by id_destination order by date desc) rn
from table
) a where rn=1
答案 1 :(得分:0)
使用此子查询查找每个目的地和发件人具有最高ID的邮件。
SELECT MAX(id) id
FROM messages
GROUP BY id_destination, sender
然后使用它来选择消息,例如:(https://www.db-fiddle.com/f/9W7YTSN8Dq7TuRYnL1jmXE/0)
SELECT *
FROM messages
WHERE id IN (
SELECT MAX(id) id
FROM messages
GROUP BY id_destination, sender
)
您可以为此添加AND sender = something
或任何其他过滤器。
假定每个新消息都有一个自动递增的ID值,因此以后的消息比以前的消息具有更高的ID值。
使用日期比较棘手,但速度慢得多。 (https://www.db-fiddle.com/f/6MKc7At6MKPm98eUEPKMYz/0)。如果在最近的日期出现多条消息,它也可能存在歧义。
SELECT *
FROM messages m
JOIN (
SELECT MAX(date) date, id_destination, sender
FROM messages
GROUP BY id_destination, sender
) x ON m.date=x.date
AND m.id_destination = x.id_destination
AND m.sender = x.sender