2016-08-22 2 views
2

Ich versuche, die vorletzten Datensätze mit mysql zu bekommen. Ich habe etwas recherchiert, einige Probe hat feste Lücke zwischen Zahlen oder Datum. Aber meine Situation ist, dass die contract_id nicht immer +1 von der vorherigen ist. Irgendwelche Ideen? Ich danke dir sehr.Zweiter Letztes records

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! = Vorherigen contract_id + X. (Die X nicht festgelegt ist) uns

'start_date' sagen die Reihenfolge der Erstellung Verträge.

+0

Warum 501, 456, 642.? . sollte 501, 456, 620 oder 506, 462, 642 .. – scaisEdge

+0

Ich möchte nur sicherstellen, dass die Leute wissen, dass die contract_id keine fortlaufende Nummer ist, und nicht immer gleich vorher contract_id + X – qqqwww

Antwort

1

Hier ist eine Option user-defined variables mit einer Zeilennummer pro Gruppe von Händlern zu etablieren und dann Filterung auf dem 2. Platz in jedem von Verträgen geordnete Gruppe:

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

Hallo Sgeddes. Danke für Ihre Lösung. Es sieht kompliziert aus ... Ich füge nur eine neue Spalte 'start_date' hinzu, die das Datum/die Bestellung des Vertrags angibt. Gibt es eine andere Möglichkeit, die Abfrage viel einfacher zu machen? – qqqwww

+0

@qqqwww - ändern Sie einfach die 'order by' in der Unterabfrage. Die Verwendung 'benutzerdefinierter Variablen' ist ein ziemlich gewöhnlicher Ansatz, aber es gibt andere. Spielen Sie mit der inneren Unterabfrage und Sie können sehen, wie die Zeilennummern pro Gruppe erstellt werden. Dann ist das Filtern an diesem Punkt einfach. – sgeddes

0

Hier ist eine andere Option , Filtern der Ergebnisse von GROUP_CONCAT() unter Verwendung von 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 

Siehe auf sqlfiddle.