आप पुनरावर्ती सबक्वेरी फैक्टरिंग का उपयोग कर सकते हैं (एक पुनरावर्ती सीटीई के रूप में भी जाना जाता है):
with tmp as (
select t.*,
row_number() over (order by t.id) as rn
from t
),
r (id, n, x, y, rn) as (
select id, n, 0, 0, rn
from tmp
where rn = 1
union all
select tmp.id, tmp.n, r.y - 1, (tmp.n * 2) + r.y - 1, tmp.rn
from r
join tmp on tmp.rn = r.rn + 1
)
select id, n, x, y
from r
order by rn;
ID N X Y
---------- ---------- ---------- ----------
2 0 0 0
3 1 -1 1
5 1 0 2
7 2 1 5
11 3 4 10
13 5 9 19
17 8 18 34
19 13 33 59
यह मूल रूप से आपके मैनुअल चरणों के माध्यम से चल रहा है। एंकर सदस्य आपका पहला मैनुअल कदम है, x
. सेटिंग और y
पहली पंक्ति के लिए दोनों शून्य। पुनरावर्ती सदस्य तब आपके द्वारा निर्दिष्ट गणना करता है। (आप नए परिकलित x
. का संदर्भ नहीं ले सकते उस पंक्ति के y
. की गणना करते समय मान , इसलिए आपको इसे (tmp.n * 2) + r.y - 1
के रूप में दोहराना होगा ) rn
अगली पंक्ति को ढूंढना आसान बनाते हुए पंक्तियों के क्रम को आईडी के आधार पर रखना है - ताकि आप rn + 1
की तलाश कर सकें अगले उच्चतम आईडी मान को सीधे खोजने के बजाय।
आपके नमूना डेटा के साथ कोई महत्वपूर्ण प्रदर्शन अंतर नहीं है, लेकिन एक हजार पंक्तियों को जोड़ने के साथ मॉडल क्लॉज में लगभग 5 सेकंड लगते हैं और पुनरावर्ती CTE में लगभग 1 सेकंड लगता है; एक और हजार पंक्तियों के साथ मॉडल ~ 20 सेकंड लेता है और सीटीई ~ 3 सेकंड लेता है; एक और हजार पंक्तियों के साथ मॉडल ने ~ 40 सेकंड और सीटीई ने ~ 6 सेकंड का समय लिया; और एक और हजार पंक्तियों के साथ (कुल मिलाकर 4,008) मॉडल ने ~ 75 सेकंड और सीटीई ने ~ 10 सेकंड का समय लिया। (मैं उससे अधिक पंक्तियों वाले मॉडल संस्करण की प्रतीक्षा में ऊब गया था; 10,000 के साथ पांच मिनट के बाद इसे मार डाला)। मैं वास्तव में यह नहीं कह सकता कि यह आपके वास्तविक डेटा के साथ कैसा प्रदर्शन करेगा, लेकिन उस आधार पर, यह शायद कोशिश करने लायक है।