2013-03-16 4 views
6

Существует таблица Remark, которая содержит данные, как показано ниже:Выберите предпоследнюю запись в каждой группе

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

Что запрос возвращает следующий результат:

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

То есть, второй последняя запись в каждой группе должна быть возвращена?

Предполагая, что все Замечание для SerialNo является непрерывным. Чем больше номер замечания, тем позднее было сделано замечание. Следовательно, второе последнее RemarkNo для SerialNo 10 равно 1 с Desp 'rainy'.

+0

ВЫБОР г1 * из замечания r1 LEFT JOIN замечание r2 ON (r1.serial_no = r2.serial_no И r1.remark_no

+0

Не должен ли он возвращаться '10 | 1 | Sunny'? –

+0

Флаг говорит mysql. –

ответ

5

Try:

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

Спасибо, Марк. Я немного изменил свой SQLFiddle, чтобы сделать его более читаемым для себя. http://sqlfiddle.com/#!2/d2cd5/4 –

0

Вот некоторые SQL псевдо-код, чтобы вы начали:

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

полностью неэффективным решением, но работает ...

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 

Рабочий пример: http://sqlfiddle.com/#!2/a1f89/22

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

  • Нет связанных вопросов^_^