SELECT
mytable.id,
mytable.date,
(
SELECT
MIN(mytablemin.date)
FROM mytable AS mytablemin
WHERE mytablemin.date > mytable.date
AND mytable.id = mytablemin.id
) AS NextDate
FROM mytable
यह एसक्यूएल सर्वर 2008 R2 पर परीक्षण किया गया (लेकिन यह अन्य DBMSs पर काम करना चाहिए) और निम्न उत्पादन का उत्पादन:
id date NextDate
----------- ----------------------- -----------------------
1 2010-05-01 00:00:00.000 2010-06-01 00:00:00.000
1 2010-06-01 00:00:00.000 2010-06-15 00:00:00.000
1 2010-07-01 00:00:00.000 2010-08-15 00:00:00.000
2 2010-06-15 00:00:00.000 2010-07-01 00:00:00.000
3 2010-08-15 00:00:00.000 NULL
3 2010-08-15 00:00:00.000 NULL
4 2010-04-01 00:00:00.000 2010-04-15 00:00:00.000
4 2010-04-15 00:00:00.000 2010-05-01 00:00:00.000
4 NULL NULL
अद्यतन 1: उन लोगों के लिए है कि रुचि रखते हैं, मैंने SQL सर्वर 2008 R2 में दो प्रकारों के प्रदर्शन की तुलना की है (एक MIN कुल योग का उपयोग करता है और दूसरा ORDER BY के साथ शीर्ष 1 का उपयोग करता है):
दिनांक कॉलम पर किसी इंडेक्स के बिना, MIN संस्करण की लागत 0.0187916 थी और शीर्ष/ORDER संस्करण के संस्करण 0.115073 की लागत थी, इसलिए MIN संस्करण "बेहतर" था।
दिनांक कॉलम पर एक सूचकांक के साथ, उन्होंने समान रूप से प्रदर्शन किया।
ध्यान दें कि यह बस इन 9 रिकॉर्ड के साथ परीक्षण किया गया था ताकि परिणाम हो सकता है (बहुत) नकली ...
अद्यतन 2: परिणाम 10,000 समान रूप से वितरित यादृच्छिक रिकॉर्ड के लिए पकड़। क्वेरी द्वारा टॉप/ऑर्डर 100,000 रिकॉर्ड चलाने के लिए बहुत लंबा समय लगता है, मुझे इसे रद्द करना और छोड़ देना था।
स्रोत
2010-08-31 14:03:10
आपका डेटाबेस – Bharat