2013-03-16 34 views
6

Có một bảng Remark có chứa dữ liệu như hình dưới đây:Chọn kỷ lục LAST THỨ HAI trong mỗi nhóm

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

truy vấn gì sẽ trả lại kết quả sau:

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

Đó là, thứ hai hồ sơ cuối cùng trong mỗi nhóm phải được trả lại?

Giả sử tất cả các chú thích không cho số sê-ri đều liên tục. Số nhận xét càng lớn, sau đó nhận xét được đưa ra. Do đó, RemarkNo cuối cùng thứ hai cho SerialNo 10 là 1 với Desp 'mưa'.

+0

CHỌN r1 * TỪ xét r1 LEFT JOIN xét r2 ON (r1.serial_no = r2.serial_no VÀ r1.remark_no

+0

Không nên trả lại '10 | 1 | Sunny'? –

+0

Cờ nói mysql. –

Trả lời

5

Hãy thử:

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

Cảm ơn bạn, Mark. Tôi đã chỉnh sửa SQLFiddle của bạn một chút để làm cho nó dễ đọc hơn cho chính tôi. http://sqlfiddle.com/#!2/d2cd5/4 –

0

Dưới đây là một số sql pseudo-code để giúp bạn bắt đầu:

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

giải pháp hoàn toàn không hiệu quả, nhưng hoạt động ...

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 

dụ làm việc: http://sqlfiddle.com/#!2/a1f89/22

Các vấn đề liên quan