मुझे लगता है कि आपकी तालिका संरचना के साथ एकमात्र समाधान सबक्वायरी के साथ काम करना है:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(उच्चतम आईडी का अर्थ नवीनतम मूल्य भी है)
हालाँकि मेरा सुझाव है कि आप एक "IsCurrent" कॉलम जोड़ें जो कि 0 है यदि यह नवीनतम मूल्य नहीं है या यदि यह नवीनतम है तो 1 है। यह असंगत डेटा के संभावित जोखिम को जोड़ देगा, लेकिन जब तालिका बड़ी हो जाती है (यदि यह एक अनुक्रमणिका में है) तो यह पूरी प्रक्रिया को बहुत तेज कर देगी। फिर आपको बस इतना करना है...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
अपडेट करें
ठीक है, मार्कस ने यह दिखाने के लिए प्रश्न अपडेट किया कि आईडी एक अद्वितीय है, इंट नहीं। इससे क्वेरी लिखना और भी जटिल हो जाता है।
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)
मैं वास्तव में या तो "IsCurrent" कॉलम का उपयोग करने का सुझाव देता हूं या उत्तरों में पाए गए अन्य सुझावों के साथ जाता हूं और "वर्तमान मूल्य" तालिका और एक अलग "मूल्य इतिहास" तालिका का उपयोग करता हूं (जो अंततः सबसे तेज़ होगा, क्योंकि यह कीमत रखता है टेबल ही छोटी)।
(मुझे पता है कि सबसे नीचे ThingID बेमानी है। बस कोशिश करें कि यह "WHERE" के साथ या उसके बिना तेज़ है या नहीं। सुनिश्चित नहीं है कि ऑप्टिमाइज़र के काम करने के बाद कौन सा संस्करण तेज़ होगा।)