Можно ли получить секционированные данные с использованием SQL?

У меня есть таблица РСУБД с BIGINTтипом столбца, и значения не являются последовательными. У меня есть java-программа, где я хочу, чтобы каждый поток получал данные, PARTITION_SIZEнапример, я хочу пару значений столбцов, например, после выполнения ORDER BYрезультата,

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, поместив все значения в a List(после получения всех значений из БД), а затем получая значения по этим конкретным индексам - {0,PARTITION_SIZE},{PARTITION_SIZE+1,2*PARTITION_SIZE}..etc, но проблема в том, что Listможет иметь миллионы записей и не рекомендуется хранить в памяти.

Поэтому мне было интересно, можно ли написать такой запрос с использованием самого SQL, который вернет мне те диапазоны, как показано ниже?

row-1 -> minId, maxId

row-2 -> minId, maxId

....

База данных - это DB2.

Например,

Для значений столбца таблицы 1,2,12,3,4,5,20,30,7,9,11 результат SQL-запроса для размера раздела = 2 должен быть {1,2},{3,4} ,{5,7},{9,11},{12,20},{30}.

java,sql,db2,

0

Ответов: 2


1 принят

В моих глазах функция 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 в ваших запросах.


1

Ответ Майкла Тифенбахера, вероятно, более полезен, так как он избегает дополнительного запроса, но если вы хотите определить диапазоны идентификаторов, это может сработать для вас:

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)
Java, SQL, DB2,