2014-02-07 2 views
0

у меня есть этот код, чтобы получить позицию каждой записи:положение строки в 100k + записей

Message.all.each_with_index do |msg, i| 
    message_order[msg.id] = i 
end 

Но теперь у меня есть 100k + сообщения, и это занимает много времени, чтобы перебрать все записи. Может ли кто-нибудь сказать мне, как сделать это более результативным? (Я использую oracle)

Я думал о rownum, но не пришел к решению. Решение, которое возвращает позицию только для одного сообщения, будет отличным.

ответ

1

Я не знаю, если я понял вашу проблему.

Если вам нужно сообщение с указанным идентификатором заказа (например: 5), вы можете выполнить что-то вроде:

SELECT message 
FROM (SELECT message, ROWNUM AS ID 
     FROM (SELECT message 
      FROM tab1 
      ORDER BY some_date)) 
WHERE ID = 5; 

Или, используя аналитические функции:

SELECT message 
FROM (SELECT message, 
      ROW_NUMBER() OVER(ORDER BY some_date) AS ID 
     FROM tab1) 
WHERE ID = 5; 
+0

Спасибо, вот и все :) –

0

Это должно работать:

Message.where("id < :id", id: msg.id).count 
+0

Сообщения Арен» t упорядочено по id –

+0

Ну, вы можете добавить order (another_field) и сменить место на «other_field