【发布时间】:2025-11-23 18:15:01
【问题描述】:
假设我有一个这样的名为“日记”的表:
| id | user_id | recorded_at | record |
|----|---------|--------------------------|--------|
| 20 | 50245 |2017-10-01 23:00:14.765366| 89 |
| 21 | 50245 |2017-12-05 10:00:33.135331| 97 |
| 22 | 50245 |2017-12-31 11:50:23.965134| 80 |
| 23 | 76766 |2015-10-06 11:00:14.902452| 70 |
| 24 | 76766 |2015-10-07 22:40:59.124553| 81 |
对于每个用户,我想检索最新的行和之前一个月内的所有行。
换句话说,对于user_id 50245,我想要他/她的数据从“2017-12-01 11:50:23.965134”到“2017-12-31 11:50:23.965134”;对于 user_id 76766,我希望他/她的数据从“2015-09-07 22:40:59.124553”到“2015-10-07 22:40:59.124553”。
因此期望的结果如下所示:
| id | user_id | recorded_at | record |
|----|---------|--------------------------|--------|
| 21 | 50245 |2017-12-05 10:00:33.135331| 97 |
| 22 | 50245 |2017-12-31 11:50:23.965134| 80 |
| 23 | 76766 |2015-10-06 11:00:14.902452| 70 |
| 24 | 76766 |2015-10-07 22:40:59.124553| 81 |
请注意,id 20 的记录不包括在内,因为它比 user_id 50245 的最后一条记录早了一个多月。
有什么方法可以编写 SQL 查询来实现这一点?
【问题讨论】:
-
@ThorstenKettner 我真的不知道。如果您有提示或关键字要搜索,请提供一些。很抱歉成为 SQL 的新手。
-
最佳查询技术取决于您的设置细节:Postgres 版本 (
SELECT version();)、表定义(user_id和recorded_at定义了NOT NULL?)、基数(多少行?),值频率(每个用户/月有多少行;最小/最大/平均)。是否有一个单独的表users为(至少)每个相关用户提供 1 行? -
@ErwinBrandstetter 为迟到的回复道歉。你的帖子很棒。请在您的答案下方查看我的评论并启发我。谢谢。
标签: sql postgresql date datetime greatest-n-per-group