簡體   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