выделение первых 3 строк в упорядоченном порядке - PullRequest
0 голосов
/ 02 июня 2011

У меня есть такие данные таблицы:

id,time,otherdata
a,1,fsdfas
a,2,fasdfag
a,3,fasdfas
a,7,asfdsaf
b,8,fasdf
a,8,asdfasd
a,9,afsadfa
b,10,fasdf
...

, по сути, я могу выбрать все данные в нужном порядке, сказав что-то вроде:

select * from mytable ordered by id,time;

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

Ответ:

Ну, я разобрался, как это сделать.Я удивлен, насколько быстро это было, так как я оперирую несколькими миллионами строк данных, и это заняло около 11 секунд.Я написал процедуру в сценарии SQL для этого, и вот как это выглядит.- Заметьте, что вместо получения последних 3 он получает последнее «n» количество строк данных.

use my_database;

drop procedure if exists getLastN;
drop table if exists lastN;

-- Create a procedure that gets the last three records for each id
delimiter //
create procedure getLastN(n int)
begin
  # Declare cursor for data iterations, and variables for storage
  declare idData varchar(32);
  declare done int default 0;
  declare curs cursor for select distinct id from my_table;
  declare continue handler for not found set done = 1;
  open curs;

  # Create a temporary table to contain our results
  create temporary table lastN like my_table;

  # Iterate through each id
  DATA_LOOP: loop

  if done then leave DATA_LOOP; end if;
  fetch curs into idData;
  insert into lastThree select * from my_table where id = idData order by time desc limit n;

  end loop;
end//

delimiter ;
call getLastN(3);
select * from lastN;

извините, если это не совсем работает, мне пришлось изменить имена переменныхи прочее, чтобы запутать работу моей работы, но я запустил этот точный кусок кода и получил то, что мне нужно!

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

Я думаю, что это так же просто, как:

SELECT * FROM `mytable`
GROUP BY `id`
ORDER BY `time` DESC
LIMIT 3
1 голос
/ 03 марта 2014

Мне известны два подхода: (1) использовать набор союзов, каждый из которых содержит «предел 3», или (2) использовать временную переменную. Эти подходы, наряду с другими полезными ссылками и обсуждением, можно найти здесь .

0 голосов
/ 02 июня 2011

Попробуйте это:

select *
from mytable as m1
where (
   select count(*) from mytable as m2
   where m1.id = m2.id
) <= 3 ORDER BY id, time
...