अपेक्षाकृत कुछ मानते हुए options
में पंक्तियाँ records
में कई पंक्तियों के लिए ।
आमतौर पर, आपके पास एक लुक-अप तालिका options
. होगा जिसे records.option_id
. से संदर्भित किया गया है , आदर्श रूप से एक विदेशी कुंजी बाधा के साथ। यदि आप ऐसा नहीं करते हैं, तो मेरा सुझाव है कि संदर्भात्मक अखंडता को लागू करने के लिए एक बनाएं:
CREATE TABLE options (
option_id int PRIMARY KEY
, option text UNIQUE NOT NULL
);
INSERT INTO options
SELECT DISTINCT option_id, 'option' || option_id -- dummy option names
FROM records;
फिर किसी ढीले इंडेक्स स्कैन का अनुकरण करने की कोई आवश्यकता नहीं है और यह बहुत सरल और तेज़ becomes हो जाता है . सहसंबद्ध उपश्रेणियाँ (option_id, id)
. पर एक सादे अनुक्रमणिका का उपयोग कर सकती हैं ।
SELECT option_id, (SELECT max(id)
FROM records
WHERE option_id = o.option_id) AS max_id
FROM options o
ORDER BY 1;
इसमें वे विकल्प शामिल हैं जिनका तालिका records
में कोई मिलान नहीं है . आपको max_id
. के लिए NULL मिलता है और आप बाहरी SELECT
. में ऐसी पंक्तियों को आसानी से हटा सकते हैं यदि आवश्यक हो।
या (एक ही परिणाम):
SELECT option_id, (SELECT id
FROM records
WHERE option_id = o.option_id
ORDER BY id DESC NULLS LAST
LIMIT 1) AS max_id
FROM options o
ORDER BY 1;
थोड़ा तेज हो सकता है। सबक्वेरी सॉर्ट क्रम का उपयोग करता है DESC NULLS LAST
- समग्र कार्य के समान max()
जो NULL मानों को अनदेखा करता है। केवल DESC
को छांटना पहले NULL होगा:
- एक PostgreSQL क्वेरी में DESC ऑर्डर करते समय NULL मान पहले क्यों आते हैं?
इसके लिए एकदम सही सूचकांक:
CREATE INDEX on records (option_id, id DESC NULLS LAST);
इंडेक्स सॉर्ट ऑर्डर ज्यादा मायने नहीं रखता है जबकि कॉलम परिभाषित हैं NOT NULL
।
छोटी तालिका options
. पर अभी भी अनुक्रमिक स्कैन हो सकता है , यह सभी पंक्तियों को लाने का सबसे तेज़ तरीका है। ORDER BY
पूर्व-क्रमित पंक्तियों को लाने के लिए एक अनुक्रमणिका (केवल) स्कैन ला सकता है।
बड़ी तालिका records
केवल (बिटमैप) इंडेक्स स्कैन के माध्यम से एक्सेस किया जाता है या, यदि संभव हो तो, इंडेक्स-ओनली स्कैन ।
db<>फिडल यहाँ - साधारण केस के लिए दो इंडेक्स-ओनली स्कैन दिखा रहा है
Old sqlfiddle
या LATERAL
का उपयोग करें Postgres 9.3+ में समान प्रभाव के लिए जुड़ता है:
- प्रति उपयोगकर्ता नवीनतम पंक्ति पुनर्प्राप्त करने के लिए क्वेरी द्वारा समूह को अनुकूलित करें