2015-08-27 2 views
0

У меня есть огромный стол:MySQL: Выберите последние N строк СГМ меньше Тогда числа

 
+------+---------+-----+-----+-------+------+---------+ 
|ticker|data_date|price|count|oper_id|ext_nr|oper_summ| 
+------+---------+-----+-----+-------+------+---------+ 
|SBER |2015-08..|70.00|15 |0  |251528|1050.00 | 
|AFLT |2015-08..|30.00|5 |0  |251525|150.00 | 
|SBER |2015-08..|69.00|10 |1  |251521|690.00 | 
|SBER |2015-08..|71.00|15 |1  |251513|1065.00 | 
|SBER |2015-08..|72.00|15 |0  |251512|1080.00 | 

    data_date format: 2015-01-05 09:59:59 
    UNIQUE KEY `idx_ticker_ext_nr` (`ticker`,`ext_nr`) 

нужно выбрать последние N строк, где SUM (oper_summ) будет быть менее 10000

Я нашел аналогичную тему: limiting the rows to where the sum a column equals a certain value in MySQL

SELECT 
    O.ext_nr, 
    O.price, O.count, 
    O.oper_summ, 
    (SELECT 
    sum(oper_summ) FROM Table1 
    WHERE ext_nr <= O.ext_nr) 'RunningTotal' 
FROM Table1 O 
HAVING RunningTotal <= 10000 

, но не смогли заставить его работать в моей coditions ...

F ound решение:

SET @msum := 0; 
select t1.* from 
(select m.*, 
(@msum := @msum + m.oper_summ) as cumul_oper_summ from jos_fintools_data m order by m.data_date DESC) 
t1 where t1.cumul_oper_summ <= 10000; 

кредитов идет на toomanyredirects: limiting the rows to where the sum a column equals a certain value in MySQL

+1

Покажите нам, что вы до сих пор, по крайней мере, будет Гоув нам ключ – RiggsFolly

+0

OK: мне нужно найти последние строки общей сумму которых будет меньше, чем 2150; в моем примере это будут цены: 71 и 72 sum (oper_summ) = 2145 <2150 –

+0

Мы здесь, чтобы помочь вам не предоставлять некоторый код. Покажите нам, что вы попробовали, и мы постараемся вам помочь. И редактировать свой вопрос, вместо того, чтобы писать важную информацию ины комментарий – Hearner

ответ

0
SET @msum := 0; 
select t1.* from 
(select m.*, 
(@msum := @msum + m.oper_summ) as cumul_oper_summ from jos_fintools_data m order by m.data_date DESC) 
t1 where t1.cumul_oper_summ <= 10000; 
0

Использовать переменные:

SELECT o.* 
FROM (SELECT O.ext_nr, O.price, O.count, O.oper_summ, 
      (@os := @os + oper_summ) as RunningTotal 
     FROM Table1 O CROSS JOIN 
      (SELECT @os := 0) params 
     ORDER BY data_date desc 
    ) o 
HAVING RunningTotal <= 10000; 

Примечание: Вам нужно заказать что-то в подзапроса. Я не уверен, что такое правая колонка. Мое лучшее предположение - столбец даты.

+0

Нет ... мне нужно СУММАТЬ весь столбец, но тогда я добавляю результат упорядочивания сумм равным oper_summ: + ------------ + ----- ------ + ------- + ----------- + -------------------- + | ext_nr | цена | счет | oper_summ | RunningTotal | + ------------ + ----------- + ------- + ----------- + --- ----------------- + | 2515424031 | 40.40500 | 5 | 202.02500 | 202.025 | И что такое @os? Meen? .. –