Java 是否可以使用SQL获取分区数据?

Java 是否可以使用SQL获取分区数据?,java,sql,db2,Java,Sql,Db2,我有一个列为BIGINT类型的RDBMS表,并且值不是顺序的。我有一个java程序,其中我希望每个线程按照分区大小获取数据,也就是说,我希望得到一对列值,比如在对结果进行排序之后 Column_Value at Row 0 , Column_Value at Row `PARTITION_SIZE` Column_Value at Row `PARTITION_SIZE+1` , Column_Value at Row `2*PARTITION_SIZE` Column_Value at

我有一个列为BIGINT类型的RDBMS表,并且值不是顺序的。我有一个java程序,其中我希望每个线程按照分区大小获取数据,也就是说,我希望得到一对列值,比如在对结果进行排序之后

Column_Value at Row 0 , Column_Value at Row `PARTITION_SIZE` 

Column_Value at Row `PARTITION_SIZE+1` , Column_Value at Row `2*PARTITION_SIZE` 

Column_Value at Row `2*PARTITION_SIZE+1` , Column_Value at Row  `3*PARTITION_SIZE`
最后,我将在SELECT查询的BETWEEN子句中传递上述值范围,以获得每个线程的分割数据

目前,我可以通过Java进行分区,在从DB中获取所有值之后,将所有值放入一个列表中,然后在这些特定的索引中获取值-{0,PARTITION_SIZE},{PARTITION_SIZE+1,2*PARTITION_SIZE}..等等,但问题是列表可能有数百万条记录,不建议存储在内存中

所以我想知道是否有可能使用SQL本身编写这样一个查询,它将返回下面这些范围

第1行->最小ID,最大ID

第2行->最小ID,最大ID

数据库是DB2

比如说,


对于表列值1,2,12,3,4,5,20,30,7,9,11,分区大小=2的SQL查询结果应为{1,2}、{3,4}、{5,7}、{9,11}、{12,20}、{30}

在我看来,mod函数可以解决您的问题,您可以使用它选择动态数量的分区

WITH numbered_rows_temp as ( 
SELECT rownumber() over () as rownum,
       col1,
       ...
       coln
  FROM table
  ORDER BY col1)

SELECT * FROM numbered_rows_temp
  WHERE mod(rownum, <numberofpartitions>) = 0  
在查询中填写适当的并将结果从0更改为-1。

可能更有用,因为它可以避免额外的查询,但如果您确实想确定ID范围,这可能对您有用:

WITH parms(partition_size) AS (VALUES 1000) -- or whatever
SELECT 
    MIN(id), MAX(id), 
    INT(rn / parms.partition_size) partition_num
FROM (
    SELECT id, ROW_NUMBER() OVER (ORDER BY id) rn 
    FROM yourtable
) t , parms
GROUP BY INT(rn / parms.partition_size)

我的问题是否正确?您希望使用多个线程并行地从DB2检索数据。您会问如何选择行以获得不相交的选择?感谢您的研究。我在问题中添加了一个示例,是的,我想你们理解的是正确的。我添加的示例对于最后一个集合只有一个值,我将在程序中处理这种情况,因为没有结束值。所以基本上对于上面的查询,如果我的表只有一列-ÌDof type BIGINT,我将在编号为_rows _temp的表中得到分区范围的结束值,我可以使用no-忘记范围-在这种情况下,mod modulo进行计算,在您得到的两个分区中,每个奇数行将在分区1中,每个偶数行将在分区2中。如果我将第一个查询作为内部查询传递,则无法得到准确的结果但如果不是单独按col1排序,而是按col1Thanks排序,则该解决方案也可以正常工作,并在同一行中提供范围值。