Как мы можем получить набор строк, начинающийся с указанной строки c? - PullRequest
0 голосов
/ 22 января 2020

у нас есть база данных со следующим конфигом:

VALUE_1 DATE | VALUE_2 INT | VALUE_3 CHAR(4) | VALUE_4 CHAR(4) ...
  1. ключ состоит из этих четырех значений
  2. Все эти значения могут повторяться, но
  3. ... Невозможно повторить одну и ту же строку дважды (только если одно из значений отличается)

Проблема: В нашем первом SELECT мы получаем первые 10 строк, после этого мы хотим получить первые 10 строк, начиная с последней, упорядоченной по VALUE_1 DATE | VALUE_2 INT | VALUE_3 CHAR(4) | VALUE_4 CHAR(4).

Как мы можем получить набор строк, начинающийся с указанного c строка?

select -> ...
OUTPUT: v1, v2 ... v10

select -> where VALUE_1 > v10, VALUE_2 = (or >) value ...
OUTPUT: v11, v12 ... v20

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Исходя из предположения / предположения, что вы имеете в виду, что не можете использовать оконные функции (?), Вы, вероятно, можете объединить limit с offset:

Select
<some columns>
from
<your table>
order by
al1, val2, val3, val4
limit <how many rows you want to return>
offset <how many rows you want to skip>

Так что, если хотите, скажите строки 101-110:

limit 10
offset 100

На данный момент у вас нет доступа к системе DB2, но это должно сработать или быть близко.

0 голосов
/ 24 января 2020

Вы можете сделать это

CREATE TABLE T (VALUE_1 DATE, VALUE_2 INT, VALUE_3 CHAR(4), VALUE_4 CHAR(4) )

INSERT INTO T VALUES
  ( '2020-01-01', 1, 'A', 'A' )
, ( '2020-01-01', 2, 'A', 'B' )
, ( '2020-01-01', 2, 'A', 'C' )
 ,( '2020-01-01', 3, 'A', 'B' )

, предполагая, что последняя строка, которую вы получили, была 2-ой (и нет пустых значений), это получит следующее

SELECT * FROM T
WHERE   (VALUE_1, VALUE_2, VALUE_3, VALUE_4 ) > ( '2020-01-01', 2, 'A', 'B' )
ORDER BY VALUE_1, VALUE_2, VALUE_3, VALUE_4 

См. Таблицу 3. Здесь https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000746.html

0 голосов
/ 22 января 2020

Я думаю, вы можете сделать это с помощью оконных функций:

select t.*
from (select t.*, row_number() over (order by val1, val2, val3, val4) as seqnum
      from t
     ) t
order by (case when seqnum <= 10 then seqnum else 11 end), -- first 10 rows first
         seqnum desc  -- the rest in reverse order
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...