使用 Kotlin 公开的 SQL DSL 选择多个值并按 ORDER BY

问题描述 投票:0回答:1

我正在尝试使用 Kotlin SQL Exposed 框架进行下一个查询。

SELECT interation_id, group_id, max(version)
FROM interaction
GROUP BY group_id;

我有一个交互表,每个交互组可以有多个交互,每个交互都标记有不同的版本。我想检索每个组的交互 ID 及其最新版本

使用公开的查询看起来像:

UserTable
    .slice(UserTable.id, UserTable.version.max())
    .selectAll()
    .groupBy(UserTable.versionGroupID)
    .toList()

但我得到了

UserTable.id must appear in the GROUP BY clause or be used in an aggregate function
的错误。但如果我这样做,我的 group by 将不会返回 versionGroupId 的单个值。

任何使用过 kotlin sdk 的人(或者可能是我这边的 SQL 暴露问题)可以帮助我吗?谢谢!

sql postgresql kotlin aggregate-functions kotlin-exposed
1个回答
0
投票

您必须创建一个子查询来查找

InteractionTable
中每个组的最大版本,然后将此子查询与原始表连接以获取与最大版本对应的每个组的
interaction_id

试试这个

  val MaxVersionPerGroup = InteractionTable
        .slice(InteractionTable.versionGroupID, InteractionTable.version.max())
        .selectAll()
        .groupBy(InteractionTable.versionGroupID)
        .alias("MaxVersionPerGroup")
    
    val query = InteractionTable
        .join(MaxVersionPerGroup, JoinType.INNER, additionalConstraint = { 
            InteractionTable.versionGroupID eq MaxVersionPerGroup[InteractionTable.versionGroupID] and
            InteractionTable.version eq MaxVersionPerGroup[InteractionTable.version.max()]
        })
        .slice(InteractionTable.interation_id, InteractionTable.group_id, InteractionTable.version)
        .selectAll()
    
    query.forEach { 
        println("Interaction ID: ${it[InteractionTable.interation_id]}, Group ID: ${it[InteractionTable.group_id]}, Version: ${it[InteractionTable.version]}")
    }
© www.soinside.com 2019 - 2024. All rights reserved.