我创建了一种肮脏的方法来做到这一点,它有效,但想知道是否有更简单的方法可以实现这一点。基本上我只想为每个用户获取最新的用户工具 ID。预先感谢!
var allUserTools = masterDB.select(Tool.USER_ID, Tool.USER_TOOL_ID)
.from(Tool.TABLE)
.orderBy(Tool.FINISHED.desc())
.fetchGroups(Tool.USER_ID, UserTool.USER_TOOL_ID));
List<Integer> allUserToolIDs = new ArrayList<>();
for (Map.Entry<Integer, List<Integer>> userTool : allUserTools.entrySet()) {
if(!userTool.getValue().isEmpty()) {
allUserToolIDs.add(userTool.getValue().get(0));
}
}
这是一个 TOP N 每个类别查询的示例,更具体地说,由于您只对每个类别(或组)的“TOP 1”行感兴趣,因此 PostgreSQL 有一个简单的解决方案,使用
DISTINCT ON
:
SELECT DISTINCT ON (USER_ID), USER_ID, USER_TOOL_ID
FROM TOOL
ORDER BY USER_ID, USER_TOOL_ID, FINISHED DESC
这可以理解为仅获取
(USER_ID, USER_TOOL_ID)
元组的不同值,根据 ORDER BY
子句更喜欢第一个值。这是一种相当深奥的语法,也可以使用窗口函数来完成,更详细(请参阅手册页)。
在 jOOQ 中:
masterDB.select(TOOL.USER_ID, TOOL.USER_TOOL_ID)
.distinctOn(TOOL.USER_ID)
.from(TOOL)
.orderBy(TOOL.USER_ID, TOOL.USER_TOOL_ID, TOOL.FINISHED.desc())
.fetch();