2013-03-16 12 views
6

C'è un tavolo Remark che contiene i dati come illustrato di seguito:Selezionare il record LAST SECOND in ogni gruppo

 SerialNo | RemarkNo | Desp 
============================================= 
      10 |   1 | rainy 
      10 |   2 | sunny 
      11 |   1 | sunny 
      11 |   2 | rainy 
      11 |   3 | cloudy 
      11 |   4 | sunny 
      12 |   1 | rainy 

Cosa query restituirà il seguente risultato:

   10 |   1 | rainy 
      11 |   3 | cloudy 
      12 |  null | null 

Cioè, il secondo l'ultimo record in ogni gruppo dovrebbe essere restituito?

Supponendo che tutti i RemarkNo per un SerialNo siano continui. Più grande è il numero di annotazione, più tardi è stata fatta l'osservazione. Quindi, il penultimo RemarkNo per SerialNo 10 è 1 con Desp 'rainy'.

+0

SELEZIONA r1 * DA osservazione r1 LEFT JOIN osservazione r2 ON (r1.serial_no = r2.serial_no E r1.remark_no

+0

Non dovrebbe restituire '10 | 1 | Sunny'? –

+0

La bandiera dice mysql. –

risposta

5

Prova:

select s.SerialNo, r.RemarkNo, r.Desp 
from (select SerialNo, max(RemarkNo) maxRemark from Remark group by SerialNo) s 
left join Remark r on s.SerialNo = r.SerialNo and s.maxRemark-1 = r.RemarkNo 
.

(SQLFiddle here.)

+0

Grazie, Mark. Ho modificato il tuo SQLFiddle un po 'per renderlo più leggibile per me stesso. http://sqlfiddle.com/#!2/d2cd5/4 –

0

Ecco alcuni sql pseudo-codice per iniziare:

select 
    penultimate.* 
from data as penultimate 
left join (
    /* query on data to return last row frome each group */ 
) as ultimate 
    on /* sql to join 2nd last record on each group to last group */ 
where not ultimate.SerialNo is null 
0

soluzione del tutto inefficaci, ma funziona ...

SELECT 
    SerialNo, 
    RemarkNo, 
    (SELECT Desp 
    FROM Remarks 
    WHERE SerialNo = r3.SerialNo AND RemarkNo = r3.RemarkNo) Desp 
FROM (
    SELECT 
     r.SerialNo, 
     (SELECT r2.RemarkNo 
     FROM Remarks r2 
     WHERE r.SerialNo = r2.SerialNo 
     ORDER BY r2.RemarkNo DESC 
     LIMIT 1, 1) RemarkNo 
    FROM (SELECT DISTINCT SerialNo FROM Remarks) r) r3 

esempio di lavoro: http://sqlfiddle.com/#!2/a1f89/22

Problemi correlati