繁体   English   中英

如何从组中获得第一个结果(Jooq)

[英]How to get the first result from a group (Jooq)

我的要求是获取一个标识符列表,每个标识符都可以引用多个记录,并返回每个标识符的最新记录。

这似乎可以通过标识符列上的orderBy(date, desc)fetchGroups()的组合来实现。 然后我使用values()来获取 Result 对象。

此时,我想要每个结果 object 中的第一个值。 我可以做get(0)来获得列表中的第一个值,但这似乎是作弊。 有没有更好的方法从Result object 中获得第一个结果?

您将编写一个 top-1-per-category 查询,这是top-n-per-category 查询的一个特例。 jOOQ 也支持在 SQL 中产生这种行为的大多数语法。 您不应该在客户端中使用分组,因为您会将所有多余的数据从服务器传输到客户端,这对应于每个组的剩余结果。

一些例子:

标准 SQL(支持 window 功能时)

Field<Integer> rn = rowNumber().over(T.DATE.desc()).as("rn");

var subquery = table(
    select(T.fields())
   .select(rn)
   .from(T)
).as("subquery");

var results = 
ctx.select(subquery.fields(T.fields())
   .from(subquery)
   .where(subquery.field(rn).eq(1))
   .fetch();

Teradata 和 H2(我们可能很快会效仿

var results = 
ctx.select(T.fields())
   .from(T)
   .qualify(rowNumber().over(T.DATE.desc()).eq(1))
   .fetch();

PostgreSQL

var results = 
ctx.select(T.fields())
   .distinctOn(T.DATE)
   .from(T)
   .orderBy(T.DATE.desc())
   .fetch();

Oracle

var results = 
ctx.select(
      T.DATE, 
      max(T.COL1).keepDenseRankFirstOrderBy(T.DATE.desc()).as(T.COL1),
      max(T.COL2).keepDenseRankFirstOrderBy(T.DATE.desc()).as(T.COL2),
      ...
      max(T.COLN).keepDenseRankFirstOrderBy(T.DATE.desc()).as(T.COLN))
   .from(T)
   .groupBy(T.DATE)
   .fetch();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM