2016-08-06 8 views
5

मुझे पिछली पंक्ति से मूल्य का उपयोग करने में कुछ समस्या है (मुझे पता नहीं है कि यह कैसे करें)।पिछली पंक्ति से मूल्य का उपयोग

update test SET amount = (select amountAfter 
from rozl (Here i want to take it from previous row = this ID - 1) 

मैं प्राथमिक कुंजी आईडी मिल गया, पूरी तालिका आईडी के अनुसार क्रमबद्ध है:

मैं की तरह कुछ करना चाहते हैं। मैं क्या करना चाहता हूं:

कॉलम नाम राशि से पिछली पंक्ति से मूल्य लें इसके बाद इसे वास्तविक आईडी में राशि में डालें।

यहाँ उदाहरण है

id amount used destroyed amountAfter 
    1  100  50   30   20 
    2  20  5   1   14 
+1

चेक आउट: https://msdn.microsoft.com/en-us/library/hh231256.aspx – Nicarus

उत्तर

3

यहाँ का उपयोग कर एक join माना आपके id क्षेत्रों अनुक्रमिक हैं एक ही विकल्प है:

update t1 
set t1.amount = t2.amountafter 
from test t1 join 
    test t2 on t2.id = t1.id - 1 

आप 2012 या अधिक प्रयोग कर रहे हैं, lag का उपयोग कर देखो:

with cte as (
    select id, amount, lag(amount) over (order by id) prevamount 
    from test 
    ) 
update cte 
set amount = prevamount 
where prevamount is not null 

और मैं पूरा होने के लिए लगता है, 2008row_number के साथ काम करता है, तो संख्या (दोनों तरीकों का एक संयोजन का उपयोग करके) अनुक्रमिक नहीं हैं होगा: विंडोइंग समारोह `LAG`

with cte as (
    select id, amount, row_number() over (order by id) rn 
    from test 
    ) 
update t1 
set t1.amount = t2.amount 
from cte t1 join 
    cte t2 on t2.rn = t1.rn - 1 
+0

शायद यह ध्यान देने योग्य है कि यह अनुक्रमिक होने पर आईडी पर निर्भर करता है (कोई भी गायब नहीं) – Nicarus

+0

@Nicarus - अच्छा बिंदु। संपादित, शायद मैं इसे भी सचमुच ले रहा था: 'यहां मैं इसे पिछली पंक्ति से लेना चाहता हूं = यह आईडी - 1' – sgeddes

+0

@sgeddes क्या आप मुझे कोई संपर्क दे सकते हैं? मेरे पास अभी एक और सवाल था, शायद जवाब बहुत आसान होगा इसलिए मैं किसी भी कारण से नया धागा शुरू नहीं करना चाहता हूं। – JustSomeNewbie

संबंधित मुद्दे