मुझे तालिका में डेटा की लगभग एक बिलियन पंक्तियाँ मिली हैं जिनका नाम और श्रेणी 1-2 1-2 है। किसी दिए गए नाम के लिए , प्रत्येक इंट अद्वितीय है, और सीमा में हर संभव पूर्णांक मौजूद नहीं है - इसलिए अंतराल हैं।
यह क्वेरी एक उदाहरण का मामला उत्पन्न करती है:
--what I have:
SELECT *
FROM ( VALUES ('foo', 2),
('foo', 3),
('foo', 4),
('foo', 10),
('foo', 11),
('foo', 13),
('bar', 1),
('bar', 2),
('bar', 3)
) AS baz ("name", "int")
मैं प्रत्येक नाम और अनुक्रमित पूर्णांकों के अनुक्रम के लिए एक पंक्ति के साथ एक लुकअप तालिका उत्पन्न करना चाहता हूं। इस तरह की प्रत्येक पंक्ति में शामिल होंगे:
नाम - नाम कॉलम
प्रारंभ का मान - सन्निहित अनुक्रम
अंत में पहला पूर्णांक - सन्निहित अनुक्रम
अवधि में अंतिम मान - अंत - प्रारंभ + 1
यह क्वेरी उपरोक्त उदाहरण के लिए उदाहरण आउटपुट उत्पन्न करती है:
--what I need:
SELECT *
FROM ( VALUES ('foo', 2, 4, 3),
('foo', 10, 11, 2),
('foo', 13, 13, 1),
('bar', 1, 3, 3)
) AS contiguous_ranges ("name", "start", "end", span)
क्योंकि मेरे पास इतनी पंक्तियाँ हैं, अधिक कुशल बेहतर है। उस ने कहा, मुझे केवल एक बार इस क्वेरी को चलाना है, इसलिए यह एक पूर्ण आवश्यकता नहीं है।
अग्रिम में धन्यवाद!
संपादित करें:
मुझे यह जोड़ना चाहिए कि PL / pgSQL समाधान का स्वागत है (कृपया किसी भी फैंसी ट्रिक्स की व्याख्या करें - मैं अभी भी PL / pgSQL के लिए नया हूं)।