मेरे पास इस तरह की संख्याओं के साथ कुछ तालिका है (स्थिति या तो मुफ़्त है या लिखित है)
आईडी_सेट नंबर की स्थिति ----------------------- 1 000001 ASSIGNED 1 000002 मुफ़्त 1 000003 सहायता प्राप्त 1 000004 मुफ़्त 1 000005 मुफ़्त 1 000006 सहायता प्राप्त 1 000007 सहायता प्राप्त 1 000008 मुफ़्त 1 000009 मुफ़्त 1 000010 मुफ़्त 1 000011 असिस्ड 1 000012 ASSIGNED 1 000013 असिस्ड 1 000014 मुफ़्त 1 001515 के अनुसार
और मुझे "n" लगातार संख्याओं को खोजने की आवश्यकता है, इसलिए n = 3 के लिए, क्वेरी वापस आ जाएगी
1 000008 मुफ़्त 1 000009 मुफ़्त 1 000010 मुफ़्त
इसे प्रत्येक id_set का केवल पहला संभव समूह वापस करना चाहिए (वास्तव में, इसे केवल id_set प्रति क्वेरी के लिए निष्पादित किया जाएगा)
मैं WINDOW फ़ंक्शंस की जाँच कर रहा था, जैसे कुछ प्रश्नों की कोशिश की COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, लेकिन यह सब मुझे मिल गया :) मैं तर्क के बारे में नहीं सोच सकता था कि पोस्टग्रेज़ में ऐसा कैसे करें।
मैं वर्चुअल कॉलम बनाने के बारे में सोच रहा था जिसमें WINDOW फ़ंक्शंस की गिनती की जा रही हो, जहां हर नंबर के लिए पंक्तियाँ हों, जहाँ स्थिति = 'मुफ़्त' हो, फिर पहली संख्या चुनें, जहाँ गिनती मेरे "n" नंबर के बराबर हो।
या हो सकता है कि समूह संख्याएँ स्थिति के अनुसार हों, लेकिन केवल एक ASSIGNED से दूसरे ASSIGNED और केवल उन समूहों का चयन करें जिनमें कम से कम "n" अंक हों
संपादित करें
मुझे यह क्वेरी मिली (और इसे थोड़ा बदल दिया)
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id_set, status ORDER BY number) AS rnd,
ROW_NUMBER() OVER (PARTITION BY id_set ORDER BY number) AS rn
FROM numbers
)
SELECT id_set,
MIN(number) AS first_number,
MAX(number) AS last_number,
status,
COUNT(number) AS numbers_count
FROM q
GROUP BY id_set,
rnd - rn,
status
ORDER BY
first_number
जो मुफ़्त / मिश्रित संख्याओं के समूह का उत्पादन करता है, लेकिन मैं केवल पहले समूह से सभी संख्याएँ लेना चाहूँगा जो शर्त पूरी करती हैं