2012-03-01 32 views
9

Tôi đang viết truy vấn và đã sử dụng giải pháp trong this thread và nó đã hoạt động phần nào nhưng tôi vẫn gặp một chút rắc rối.SQL - Chọn bản ghi mới nhất khi có một bản sao

Tôi muốn chọn một loạt các bản ghi dành cho hầu hết các phần độc đáo, nhưng có một số ít xảy ra hai lần. Tôi muốn có thể chỉ chọn bản ghi có ngày mới nhất. Đây là câu hỏi của tôi cho đến nay:

SELECT tb1.id,tb1.type,tb1.date 

FROM Table tb1 

WHERE tb1.type = 'A' OR 'B' 
AND tb1.date = (SELECT TOP 1 tb2.date 
       FROM Table tb2 
       WHERE tb2.date = tb1.date 
       ORDER BY tb2.date DESC) 

này hoạt động như xa như nó lấy kỷ lục mới nhất của các hồ sơ có bản sao, nhưng những hồ sơ mà KHÔNG có bản sao không xuất hiện ở tất cả.

Cảm ơn bạn đã giúp đỡ và xin lỗi nếu tôi đã bỏ lỡ điều gì đó siêu rõ ràng; Tôi mới vào trò chơi SQL.

+0

Bạn có thể cung cấp dữ liệu mẫu của các hàng duy nhất không được trả lại so với các bản sao chính xác không? – kaj

+0

Lưu ý rằng bạn xuất hiện để tham gia vào ngày và không phải bởi bất cứ điều gì khác, ví dụ như id. Điều đó có chủ ý không? – kaj

+0

bạn có thể cụ thể hơn không? Bạn nói: "Tôi muốn có thể chỉ chọn bản ghi có ngày mới nhất" và sau đó "nhưng những bản ghi KHÔNG có bản sao không xuất hiện ở tất cả" ... có vẻ như hai điều khác nhau đối với tôi. – Diego

Trả lời

17

Có một số cách để làm điều đó, một cách là sử dụng ROW_NUMBER như thế này:

SELECT id, type, date 
FROM 
(
    SELECT tb1.id, tb1.type, tb1.Date, 
     ROW_NUMBER() OVER (PARTITION BY tb1.id ORDER BY tb1.Date DESC) AS RowNo 
    FROM Table tb1 
    WHERE tb1.type IN ('A','B') 
) x 
WHERE x.RowNo = 1 

này sẽ trả lại hàng cho mỗi biệt id giá trị mà có ngày mới nhất.

+0

Cảm ơn AdaTheDev, điều này đã giải quyết được vấn đề và tôi đã có thể hoàn thành truy vấn mà không còn trùng lặp nữa! –

+0

Lỗi đánh máy nhỏ: tb2.Date phải là tb1.Date – Vladimirs

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