2016-08-22 19 views
2

私はmysqlを使用して2番目の最後のレコードを取得しようとしています。 私はいくつかの調査を行いました。いくつかのサンプルには数字や日付の間にギャップがあります。しかし私の状況では、contract_idは必ずしも前回の+1とは限りません。誰のアイデアですか?どうもありがとうございます。2番目の最後のレコード

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が固定されていない)

'START_DATEは' 私たちに順序を作成する契約を伝えます。ここで

+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

ここでは別のオプションがあります、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でご覧ください。

関連する問題