Tôi nghĩ giải pháp duy nhất với cấu trúc bảng của bạn là làm việc với một truy vấn con:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Với ID cao nhất cũng có nghĩa là giá mới nhất)
Tuy nhiên, tôi khuyên bạn nên thêm cột "Hiện tại" là 0 nếu đó không phải là giá mới nhất hoặc 1 nếu là giá mới nhất. Điều này sẽ thêm rủi ro có thể xảy ra về dữ liệu không nhất quán, nhưng nó sẽ tăng tốc toàn bộ quá trình lên rất nhiều khi bảng lớn hơn (nếu nó nằm trong một chỉ mục). Sau đó, tất cả những gì bạn cần làm là ...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
CẬP NHẬT
Được rồi, Markus đã cập nhật câu hỏi để cho thấy rằng ID là duy nhất, không phải int. Điều đó làm cho việc viết truy vấn trở nên phức tạp hơn.
SELECT T.*
FROM Thing T
JOIN (SELECT ThingID, max(PriceDateTime)
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID) X ON X.ThingID = T.ThingID
AND X.PriceDateTime = T.PriceDateTime
WHERE ThingID IN (1,2,3,4)
Tôi thực sự khuyên bạn nên sử dụng cột "Hiện tại" hoặc đi với đề xuất khác được tìm thấy trong câu trả lời và sử dụng bảng "giá hiện tại" và bảng "lịch sử giá" riêng biệt (cuối cùng sẽ là bảng nhanh nhất, vì nó giữ nguyên giá bảng nhỏ).
(Tôi biết rằng ThingID ở dưới cùng là dư thừa. Chỉ cần thử xem nó có nhanh hơn khi có hoặc không có "WHERE" đó. Không chắc phiên bản nào sẽ nhanh hơn sau khi trình tối ưu hóa hoạt động.)