是否可以选择SQL中的所有列,但只选择每三行一列



我想选择所有列,但每X行都要选择每一行。

例如,如果我想选择所有行,写如下:

@Transactional
@Query(value = "SELECT * FROM data WHERE job_name = :jobName ORDER BY date_time ASC LIMIT :selectedLimit OFFSET :selectedOffset" , nativeQuery = true)
List<Data> findByJobNameOrderByDateTimeAscLimit(@Param("jobName") String jobName, @Param("selectedOffset") long selectedOffset, @Param("selectedLimit") long selectedLimit);

但我想用一些";对于每一个X行";或者类似的东西。这可能吗?

使用java代码过滤器的方法将选择所有数据并对其进行过滤,这不是很有效。

如果您想使用SQL实现这一点,那么查询将取决于您使用的方言。

例如,在Oracle中,可以使用ROWNUM,例如:

select *
from (select ROWNUM as rn, t.*
from Table t)
WHERE MOD(rn, 3) = 0 

在上面的代码中;3〃;是";X〃;根据你的问题,意思是";每三行将被选择一次";

如果您不需要";RN";在您的结果中-在上级查询中使用Select t.*

若您的DB方言不支持ROWNUM——您可以通过包装查询自己添加它,下面的问题应该让您知道如何做到这一点:当我将它与db2一起用于分页时,我的下一个页面会给出错误

您可以在调用代码中添加此流,例如:

int count[] = new int[1];
List<Data> collect = dataList.stream()
.peek(s -> count[0]++)
.filter(s -> count[0] % 3 != 0)
.collect(Collectors.toList());

"3"是你的";selectedLimit;

此外,您可以使用此代码创建一个通用utils方法,并将findByJobNameOrderByDateTimeAscLimit封装在您的服务中,并使用示例中的帮助代码获取和筛选List<Data>

最新更新