У меня есть такие данные таблицы:
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;
извините, если это не совсем работает, мне пришлось изменить имена переменныхи прочее, чтобы запутать работу моей работы, но я запустил этот точный кусок кода и получил то, что мне нужно!