Slick 2.1.0 GroupBy 并获取所有列
Slick 2.1.0 GroupBy and fetch all columns
对于以下 table 结构:
id externalId name version
1 10 n1 1
2 65 n2 2
3 10 n3 2
4 77 n4 1
我正在尝试获取所有具有按 externalId 分组的最大版本的条目(所有列)。预期结果应该是:
id externalId name version
2 65 n2 2
3 10 n3 2
4 77 n4 1
为此,我定义了以下巧妙的查询:
val resulting = myTableEntries
.groupBy(x => x.externalID)
.map {
case (id, group) =>
(id, group.map(_.version).max)
}
我怎样才能得到所有的列,而不仅仅是 ID 和版本?
实际上我需要的是以下 SQL 的 Slick 版本:
select myTable.id, myTable.name, myTable.externalId, myTable.version
from MyTable myTable
where version =
(select max(revision) from MyTable myTable1 where myTable.id=myTable1.id)
我没有在 Slick 上工作过,但是看着 scala 代码和你的要求,我想到了下面提到的问题。
另一种解决问题的方法是在 SQL 中使用 Rank 函数,对组内的每条记录进行排名,在您的情况下为 externalID并根据您的情况对版本进行排名。
完成后,您可以 select 所有排名为 1
的记录
关于如何解决此类情况,请参考以下问题。
基于 this example and this answer,我认为您需要以下内容:
val maxVersionByExternalID = myTableEntries
.groupBy(x => x.externalID)
.map {
case (externalID, group) =>
(externalID, group.map(_.version).max)
//We have the pair of ids and max versions _not yet run_ so we can join
val resulting = (myTableEntries join maxVersionByExternalID on (
(entries, maxPair) => //join condition
entries.externalID === maxPair._1 && entries.version === maxPair._2))
.map{case (entries, maxPair) => entries}//keep only the original
.run //materialize at the end
对于以下 table 结构:
id externalId name version
1 10 n1 1
2 65 n2 2
3 10 n3 2
4 77 n4 1
我正在尝试获取所有具有按 externalId 分组的最大版本的条目(所有列)。预期结果应该是:
id externalId name version
2 65 n2 2
3 10 n3 2
4 77 n4 1
为此,我定义了以下巧妙的查询:
val resulting = myTableEntries
.groupBy(x => x.externalID)
.map {
case (id, group) =>
(id, group.map(_.version).max)
}
我怎样才能得到所有的列,而不仅仅是 ID 和版本?
实际上我需要的是以下 SQL 的 Slick 版本:
select myTable.id, myTable.name, myTable.externalId, myTable.version
from MyTable myTable
where version =
(select max(revision) from MyTable myTable1 where myTable.id=myTable1.id)
我没有在 Slick 上工作过,但是看着 scala 代码和你的要求,我想到了下面提到的问题。
另一种解决问题的方法是在 SQL 中使用 Rank 函数,对组内的每条记录进行排名,在您的情况下为 externalID并根据您的情况对版本进行排名。
完成后,您可以 select 所有排名为 1
的记录关于如何解决此类情况,请参考以下问题。
基于 this example and this answer,我认为您需要以下内容:
val maxVersionByExternalID = myTableEntries
.groupBy(x => x.externalID)
.map {
case (externalID, group) =>
(externalID, group.map(_.version).max)
//We have the pair of ids and max versions _not yet run_ so we can join
val resulting = (myTableEntries join maxVersionByExternalID on (
(entries, maxPair) => //join condition
entries.externalID === maxPair._1 && entries.version === maxPair._2))
.map{case (entries, maxPair) => entries}//keep only the original
.run //materialize at the end