আমার কাছে নিম্নলিখিত ইনপুট রয়েছে:
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) ) অভ্যন্তরীণভাবে স্কোয়ার তৈরি করবে । আমি টি-স্কুএলটিকে এটিকে অনুকূল করে তোলার প্রত্যাশা করেছি - একটি ব্লক / রেকর্ড স্তরে, কাজটি করা খুব সহজ এবং লিনিয়ার, মূলত লুপের জন্য ( ও (এন) )।
তবে, আমার পরীক্ষা-নিরীক্ষায়, সর্বশেষতম এমএস এসকিউএল 2016 এই কোয়েরিকে সঠিকভাবে অনুকূলিত করতে পারে না, এই কোয়েরিটিকে বড় ইনপুট টেবিলের জন্য কার্যকর করা অসম্ভব করে তুলেছে।
তদ্ব্যতীত, ক্যোয়ারীটি দ্রুত চালাতে হবে, একইভাবে সহজ (তবে খুব আলাদা) কার্সার-ভিত্তিক সমাধানটি অনিবার্য।
কিছু মেমরি-ব্যাকড অস্থায়ী টেবিল ব্যবহার করা একটি ভাল আপস হতে পারে তবে আমি নিশ্চিত নই যে এটি উপকারীগুলি ব্যবহার করে আমার উদাহরণের ক্যোয়ারীটি কার্যকর হয়নি বলে বিবেচনা করে তা দ্রুততরভাবে চালানো যায় কিনা।
আমি টি-স্কিএল ডক্স থেকে কিছু উইন্ডোংয়ের ফাংশনটিও সন্ধান করতে চাইছি, আমি যা চাই তা করতে ট্রিক করা যায়। উদাহরণস্বরূপ, संचयी যোগফল খুব একই রকম কিছু করছে, তবে আমি সর্বশেষের অ-নাল উপাদান দেওয়ার জন্য এটি চালাকি করতে পারি না, এবং এর আগে উপাদানের যোগফলটি না দিয়ে।
আদর্শ সমাধানটি প্রক্রিয়াগত কোড বা অস্থায়ী সারণী ছাড়াই একটি দ্রুত ক্যোয়ারী হবে। বিকল্পভাবে, অস্থায়ী টেবিলগুলি সহ একটি সমাধানও ঠিক আছে, তবে প্রক্রিয়াগতভাবে সারণির পুনরাবৃত্তি করা এটি নয়।