sql - 使用任何最新的 N 个标签获取所有行
问题描述
我需要获取N个最新标签的所有记录,即按时间戳排序。
我设法构建了以下查询来检索最新的 20 个标签。但是,当我尝试加入结果时,“限制”将影响总行数,而不是唯一标签的数量。
SELECT id, tag, timestamp
FROM items AS T1
WHERE NOT EXISTS (
SELECT *
FROM items AS T2
WHERE T2.tag = T1.id AND T2.timestamp > T1.timestamp
)
ORDER BY timestamp DESC
LIMIT 20;
所以给定下表...
id | tag | timestamp
----+------------+------------
1 | Green | 2019-04-30
2 | Red | 2019-04-29
3 | Blue | 2019-04-28
4 | Green | 2019-04-27
5 | White | 2019-04-26
6 | Red | 2019-04-25
7 | Black | 2019-04-24
8 | Blue | 2019-04-23
9 | Red | 2019-04-22
10 | Black | 2019-04-21
...对最新的 3 个最新标签的查询应输出以下或类似内容:
id | tag | timestamp
----+------------+------------
1 | Green | 2019-04-30
4 | Green | 2019-04-27
2 | Red | 2019-04-29
6 | Red | 2019-04-25
9 | Red | 2019-04-22
3 | Blue | 2019-04-28
8 | Blue | 2019-04-23
解决方案
如果你想要最近的 20 个,重复:
SELECT id, tag, timestamp
FROM items i
WHERE i.tag IN (SELECT i2.tag
FROM i2
ORDER BY timestamp DESC
FETCH FIRST 20 ROWS ONLY
);
ORDER BY timestamp DESC ;
如果你想要最近的 20 个没有重复:
SELECT id, tag, timestamp
FROM items i
WHERE i.tag IN (SELECT i2.tag
FROM i2
GROUP BY i2.tag
ORDER BY MAX(timestamp) DESC
FETCH FIRST 20 ROWS ONLY
);
ORDER BY timestamp DESC
推荐阅读
- .net-core - 在 .netcore API 项目中实现 Microsoft Graph API
- javascript - 预定数量的捕获组
- twitter - 如何将 Neo4j 沙盒项目数据(俄罗斯 Twitter 巨魔)直接带到我本地笔记本电脑上的 Neo4j 桌面
- vue.js - 如何过滤一些 vuex 数据以响应选择更改
- r - 边缘上的 R partykit::ctree 偏移标签
- java - 如何修复 ApplicationResources_fr.properties 损坏
- excel - 提示用户根据单元格值保存 Excel 文件名(使用 VBA)
- javascript - 同时从多个 Promise 中返回 Cloud Firebase 数据
- css - 在我的网站的移动版本上显示表格时出现问题
- azure - 如何替换 Azure 规模集 VM 操作系统磁盘(从快照还原)