2016-08-22 3 views
2

Я пытаюсь получить вторую последнюю запись, используя mysql. Я сделал некоторые исследования, некоторые образцы исправления разрыв между числами или даты. Но моя ситуация заключается в том, что contract_id не всегда +1 от предыдущего. Все идеи? Огромное спасибо.Second Последние записи

merchant_id \t contract_id  start_date 
 
10 \t    501   2016-05-01 
 
10 \t    506   2016-06-01 
 
13 \t    456   2015-12-01 
 
13 \t    462   2016-01-01 
 
14 \t    620   2016-06-01 
 
14 \t    642   2016-07-01 
 
14 \t    656   2016-07-05 
 
\t 
 
\t 
 
merchant_id \t Second_last_contract_id 
 
10 \t    501 
 
13 \t    456 
 
14 \t    642

contract_id! = Предыдущая contract_id + X (The X не фиксировано)

'start_date' говорят нам контракты, создающие заказ.

+0

Почему 501, 456, 642.? , должен быть 501, 456, 620 или 506, 462, 642 .. – scaisEdge

+0

Я просто хочу убедиться, что люди знают, что contract_id не является непрерывным числом и не всегда равен предыдущему контракту_id + X – qqqwww

ответ

1

Вот один из вариантов с помощью user-defined variables установить номер строки в каждой группе торговцев, а затем фильтрации на 2-й в каждой группе по заказу контрактов:

select * 
from (
    select *, 
     @rn:=if(@prevMerchantId=merchantid, 
       @rn+1, 
       if(@prevMerchantId:=merchantid, 1, 1) 
      ) as rn 
    from yourtable cross join (select @rn:=0, @prevMerchantId:=null) t 
    order by merchantId, contractid desc 
) t 
where rn = 2 
+0

Привет, Sgeddes. Спасибо за ваше решение. Это выглядит сложным ... Я просто добавляю новый столбец «start_date», который указывает, что контракт создает дату/порядок. Есть ли другой способ сделать запрос более простым? – qqqwww

+0

@qqqwww - просто измените «порядок на» в подзапросе. Использование 'user-defined variables' является довольно распространенным подходом, но есть и другие. Играйте с внутренним подзапросом, и вы можете увидеть, как он устанавливает номера строк для каждой группы. Тогда фильтрация в этой точке проста. – sgeddes

0

Вот еще один вариант , фильтрация результатов GROUP_CONCAT() с использованием SUBSTRING_INDEX():

SELECT merchant_id, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(
      GROUP_CONCAT(contract_id ORDER BY start_date DESC), 
     ',', 2), ',', -1) AS Second_last_contract_id 
FROM  the_table 
GROUP BY merchant_id 

Посмотрите на sqlfiddle.

Смежные вопросы