我是JOOQ的新手。我有一个用例,需要从表中选择具有最新时间戳字段值的行。
我的表按事件日期分区。所以当我查询表时,我得到了相同id的多个记录。现在,我不想为同一个id获得许多记录,相反,我只需要返回一个具有最新时间戳字段值的记录。
使用基本的SQL语法,我能够实现这一点,但我无法通过JOOQ实现这一点。
SQL:
select *
from abc.student t
inner join (
select id, max(event_date) as MaxDate
from abc.student group by id
) tm on t.id = tm.id and t.event_date = tm.MaxDate ;
Java:
public Iterable<MyClass> fetchMyRecords(Iterable<String> MyIds) {
return dslContext.selectFrom(MYTABLE)
WHERE(MYTABLE.ID.in(List.newArrayList(ids)))
.fetchInto(MyObject.class);
}
预期结果:如何获得列表
更新问题
假设我必须从所有分区中获取具有最新事件日期的学生列表。下面是我编写的Jooq查询,但它只返回一个MyStudent类型的对象。
问题——如何对特定id应用限制。给定n个ID的列表,我需要得到n个Mystudent对象,其中每个对象都有max event_date
下面是只返回1个对象的查询
我有另一个问题,我如何做到这一点,没有加入。下面是Jooq代码,它只适用于一个id。但是我的函数接受id列表并从表中获取记录。
public Iterable<MyClass> fetchMyRecords(Iterable<String> MyIds) {
return dslContext.select().from(TABLE)
.where(TABLE.ID.in(Lists.newArrayList(ids)))
.orderBy(TABLE.EVENT_DATE.desc())
.limit(1)
.fetchInto(MyStudent.class); }
因此,给定3个id的集合(例如),我如何获取3个我的学生类对象,其中每个对象是最大的(event_date)记录。如果我使用限制,它将只返回第一个id记录。如果我不使用限制,它将返回所有旧的ID重复行。
我正在把你的评论中的问题翻译成jOOQ:
// Assuming these static imports
import static org.jooq.impl.DSL.*;
import static com.example.generated.Tables.*;
Student t = STUDENT.as("t");
Field<Date> maxDate = max(STUDENT.EVENT_DATE).as("MaxDate");
Table<?> tm = table(select(STUDENT.ID, maxDate)
.from(STUDENT)
.groupBy(STUDENT.ID)).as("tm");
ctx.select()
.from(t)
.join(tm)
.on(t.ID.eq(tm.field(STUDENT.ID)))
.and(t.EVENT_DATE.eq(tm.field(maxDate)))
.fetch();
问题内容: 我有一张表: 我需要选择具有最大更新值的id和val。因此,对于此表,结果应为: 问题答案: 这需要在与主表连接的子查询中进行汇总。
问题内容: 我在SO上看到过类似类型的问题,但是,我无法找到针对我特定问题的解决方案。(仅供参考,这些不是我的真实专栏,只是一个简短的示例)。 我有一个基本表: 因此,我想做的是能够: 我已经尝试过类似的东西: 但这不会返回我要查找的行。修复此查询的任何帮助都将非常有用。 非常感谢。 问题答案: 编辑: 顺便说一句,如果您想知道为什么原来的查询不起作用,让我们分解一下: 从…中选择一些东西 其中=
问题内容: 我正在尝试从数据库表中仅选择今天的记录。 目前我使用 但这需要过去24小时的结果,我需要它只选择今天的结果,而忽略时间。如何仅根据日期选择结果? 问题答案: 使用和 我想 使用 仍然使用INDEX 。 在演示中查看执行计划
在oracle DB中检索具有大组最大值的行时遇到问题。 我的桌子看起来是这样的: id,col1,col2,col3,col4,col5,date_col 谢谢你的提示! 干杯
我试图找出如何从我用这个脚本做的表中提取Suma列上具有最高值的行: 可以使用以下方法创建DB表: 创建表Pacienti(CodP int not null主键、Nume varchar(50)、Prenume varchar(50)、Descriere varchar(50)、Varsta int、DataNasterii varchar(50) ); 创建表Proceduri(CodProc
问题内容: 什么是最好,最简单的方法?我的查询当前是: 但是,这显示前10行,而不显示最后10行。 编辑:我想要最后10行(这是,DESC做到这一点)但是,我希望它们以升序返回。 问题答案: 颠倒顺序(因此获得最后10个而不是前10个),请使用代替 编辑 根据您的评论: