Как ограничить количество строк, возвращаемых запросом Oracle после упорядочивания?

Простое решение

var tx = [{"id":1},{"id":2}];
var tx1 = [{"id":3},{"id":4}];


var txHistory = tx.concat(tx1)

console.log(txHistory); 
// output
 // [{"id":1},{"id":2},{"id":3},{"id":4}];
934
задан DineshDB 26 March 2018 в 09:39
поделиться

3 ответа

(непротестированный) что-то вроде этого может сделать задание

WITH
base AS
(
    select *                   -- get the table
    from sometable
    order by name              -- in the desired order
),
twenty AS
(
    select *                   -- get the first 30 rows
    from base
    where rownum < 30
    order by name              -- in the desired order
)
select *                       -- then get rows 21 .. 30
from twenty
where rownum > 20
order by name                  -- in the desired order

существует также разряд аналитической функции, который можно использовать для упорядочивания.

-4
ответ дан EvilTeach 26 March 2018 в 09:39
поделиться
  • 1
    Я удалил дополнительные строки, которые совпадают с в моем сообщении. Я надеюсь Вы don' t ум. – jwfearn 11 January 2011 в 03:00

Можно использовать подзапрос для этого как

select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM <= 5;

, Имеют также взгляд на тему На ROWNUM и ограничивающих результатах в Oracle/AskTom для получения дополнительной информации.

Обновление : Для ограничения результата и с вещами нижних и с верхних границ становятся более чрезмерно увеличенными в размерах с

select * from 
( select a.*, ROWNUM rnum from 
  ( <your_query_goes_here, with order by> ) a 
  where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum  >= :MIN_ROW_TO_FETCH;

(Скопированный с указанной AskTom-статьи)

Обновление 2 : Запуск с Oracle 12c (12.1) существует синтаксис, доступный, чтобы ограничить строки или запуститься при смещениях.

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

См. этот ответ для большего количества примеров. Благодаря Krumia для подсказки.

761
ответ дан Kosi2801 26 March 2018 в 09:39
поделиться

Аналитическое решение только с одним вложенным запросом:

SELECT * FROM
(
   SELECT t.*, Row_Number() OVER (ORDER BY name) MyRow FROM sometable t
) 
WHERE MyRow BETWEEN 10 AND 20;

Rank() мог быть заменен Row_Number(), но мог бы возвратить больше записей, чем Вы ожидаете, существуют ли дублирующиеся значения для имени.

53
ответ дан sampathsris 26 March 2018 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: