2016-08-22 105 views
2

我想获得第二个最后记录使用mysql。 我做了一些研究,一些样本已修复数字或日期之间的差距。但是我的情况是,contract_id并不总是前一个+1。任何想法?非常感谢。第二个最后记录

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.(的X是不固定的)

'起始日期' 告诉我们创造秩序的合同。

+0

为什么选择501,456,642。? 。应该是501,456,620或506,462,642 .. – scaisEdge

+0

我只是想确保人们知道contract_id不是连续的数字,并且不总是等于先前的contract_id + X – qqqwww

回答

1

下面是使用user-defined variables建立每个商家的组行号,然后在各组中的第二个通过合同订购过滤一个选项:

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

Hi Sgeddes。感谢您的解决方案。它看起来很复杂...我只是添加一个新的'start_date'列,它表明合同创建日期/订单。是否有任何其他方式使查询变得更加简单? – qqqwww

+0

@qqqwww - 只需在子查询中更改'order by'。使用'用户定义的变量'是一种非常普遍的方法,但也有其他的。玩内部子查询,你可以看到它是如何建立每组的行数。然后过滤很容易。 – sgeddes

0

这里的另一种选择,使用SUBSTRING_INDEX()筛选结果GROUP_CONCAT()

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

相关问题