मेरे पास निम्नलिखित इनपुट हैं:
id | value
----+-------
1 | 136
2 | NULL
3 | 650
4 | NULL
5 | NULL
6 | NULL
7 | 954
8 | NULL
9 | 104
10 | NULL
मुझे निम्नलिखित परिणाम की उम्मीद है:
id | value
----+-------
1 | 136
2 | 136
3 | 650
4 | 650
5 | 650
6 | 650
7 | 954
8 | 954
9 | 104
10 | 104
तुच्छ समाधान एक <
संबंध के साथ तालिकाओं में शामिल हो जाएगा , और फिर MAX
एक में मूल्य का चयन GROUP BY
:
WITH tmp AS (
SELECT t2.id, MAX(t1.id) AS lastKnownId
FROM t t1, t t2
WHERE
t1.value IS NOT NULL
AND
t2.id >= t1.id
GROUP BY t2.id
)
SELECT
tmp.id, t.value
FROM t, tmp
WHERE t.id = tmp.lastKnownId;
हालांकि, इस कोड का तुच्छ निष्पादन आंतरिक रूप से इनपुट तालिका ( O (n ^ 2) ) की पंक्तियों की गणना का वर्ग पैदा करेगा । मुझे उम्मीद थी कि टी-सीक्लल इसे ऑप्टिमाइज़ करने के लिए - एक ब्लॉक / रिकॉर्ड स्तर पर, करने का कार्य बहुत आसान और रैखिक है, अनिवार्य रूप से लूप ( ओ (एन) ) के लिए।
हालाँकि, मेरे प्रयोगों पर, नवीनतम MS SQL 2016 इस क्वेरी को सही ढंग से अनुकूलित नहीं कर सकता है, जिससे इस क्वेरी को एक बड़ी इनपुट तालिका के लिए निष्पादित करना असंभव है।
इसके अलावा, क्वेरी को जल्दी से चलाना है, जिससे एक समान आसान (लेकिन बहुत अलग) कर्सर-आधारित समाधान संभव है।
कुछ मेमोरी-समर्थित अस्थायी तालिका का उपयोग करना एक अच्छा समझौता हो सकता है, लेकिन मुझे यकीन नहीं है कि अगर यह काफी तेज चलाया जा सकता है, तो यह माना जाता है कि उप-वर्ग का उपयोग करने वाला मेरा उदाहरण क्वेरी काम नहीं करता है।
मैं t-sql डॉक्स से कुछ विंडोिंग फंक्शन को खोदने के बारे में भी सोच रहा हूं, जो मैं चाहता हूं उसे करने के लिए छल किया जा सकता है। उदाहरण के लिए, संचयी योग कुछ बहुत समान है, लेकिन मैं इसे नवीनतम गैर-अशक्त तत्व देने के लिए ट्रिक नहीं कर सकता, और पहले तत्वों का योग नहीं।
आदर्श समाधान प्रक्रियात्मक कोड या अस्थायी तालिकाओं के बिना एक त्वरित क्वेरी होगा। वैकल्पिक रूप से, अस्थायी तालिकाओं के साथ एक समाधान भी ठीक है, लेकिन तालिका को प्रक्रियात्मक रूप से पुनरावृत्त करना नहीं है।