Я пытаюсь выполнить нумерацию страниц с очень старой версией DB2, и единственный способ определить диапазон строк - это использовать команду OVER.
Этот запрос предоставляет правильные результаты (результаты, которые я хочу разбить на страницы).
select MIN(REFID) as REFID, REFGROUPID from ARMS_REFERRAL where REFERRAL_ID<>'Draft' and REFERRAL_ID not like 'Demo%' group by REFGROUPID order by REFID desc
Результаты:
REFID REFGROUPID
302 242
301 241
281 221
261 201
225 142
221 161
... ...
SELECT * FROM ( SELECT row_number() OVER () AS rid, MIN(REFID) AS REFID, REFGROUPID FROM arms_referral where REFERRAL_ID<>'Draft' and REFERRAL_ID not like 'Demo%' group by REFGROUPID order by REFID desc ) AS t WHERE t.rid BETWEEN 1 and 5
Результаты:
REFID REFGROUPID
26 12
22 11
14 8
11 7
6 4
Как видите, он выбирает первые пять строк, но, очевидно, не выбирает последние.
Если я добавлю предложение Order By к OVER (), оно станет ближе, но все же не совсем правильно.
SELECT * FROM ( SELECT row_number() OVER (ORDER BY REFGROUPID desc) AS rid, MIN(REFID) AS REFID, REFGROUPID FROM arms_referral where REFERRAL_ID<>'Draft' and REFERRAL_ID not like 'Demo%' group by REFGROUPID order by REFID desc ) AS t WHERE t.rid BETWEEN 1 and 5
REFID REFGROUPID
302 242
301 241
281 221
261 201
221 161
Это действительно близко, но 5-й результат неверен (фактически 6-й результат).
Как сделать этот запрос корректным, чтобы он мог группироваться по REFGROUPID, а затем упорядочивать по REFID?