如何在 Slick 中表达 window 函数?
How to express window function in Slick?
我是 Slick 的新手,我很难在 Slick 中表达 SQL window 功能。我的数据库配置文件是 SQL 服务器,所以我不能使用 slick-pg。
我要解决的问题很简单SQL(下)。本质上就是给每个destination
找最大的rowid
。如何在 Slick 中写入此内容?
select rowid, destination
from (
select rowid
, destination
, row_number() over (partition by destination order by rowid desc) as rowOrder
from DestinationTable
)
where rowOrder = 1
Slick 在其查询 DSL 中不支持此功能,因此您需要使用 Slick 对普通 SQL 查询的支持。
检查 slick 中的用户定义函数,
https://scala-slick.org/doc/3.1.0/userdefined.html
这是一个示例,我使用 SimpleLiteral 实现了相同的要求,理想情况下 SimpleFunction 可能是不错的选择,但 SimpleLiteral 适用于我的用例。
并使用子查询过滤 rowNum 数据。
val rowNumCol = SimpleLiteral[Int]("ROW_NUMBER() OVER(PARTITION BY replaceGroupByColumnName order by sortColumnName desc)")
val innerQueryRowNum = queryFilter.map(jb => (jb.guid, rowNumCol))
val resultQueryFilter = TableQuery.join(innerQueryRowNum).on((tb, tbs) => tb.guid === tbs._1).filter(tb => tb._2._2 === 1).map(tb => tb._1)
我是 Slick 的新手,我很难在 Slick 中表达 SQL window 功能。我的数据库配置文件是 SQL 服务器,所以我不能使用 slick-pg。
我要解决的问题很简单SQL(下)。本质上就是给每个destination
找最大的rowid
。如何在 Slick 中写入此内容?
select rowid, destination
from (
select rowid
, destination
, row_number() over (partition by destination order by rowid desc) as rowOrder
from DestinationTable
)
where rowOrder = 1
Slick 在其查询 DSL 中不支持此功能,因此您需要使用 Slick 对普通 SQL 查询的支持。
检查 slick 中的用户定义函数, https://scala-slick.org/doc/3.1.0/userdefined.html
这是一个示例,我使用 SimpleLiteral 实现了相同的要求,理想情况下 SimpleFunction 可能是不错的选择,但 SimpleLiteral 适用于我的用例。
并使用子查询过滤 rowNum 数据。
val rowNumCol = SimpleLiteral[Int]("ROW_NUMBER() OVER(PARTITION BY replaceGroupByColumnName order by sortColumnName desc)")
val innerQueryRowNum = queryFilter.map(jb => (jb.guid, rowNumCol))
val resultQueryFilter = TableQuery.join(innerQueryRowNum).on((tb, tbs) => tb.guid === tbs._1).filter(tb => tb._2._2 === 1).map(tb => tb._1)