2010-09-24 14 views
9

मैं एक मेज की तरह इस एक:SQLite: संचायक (योग) एक SELECT कथन में स्तंभ

तालिका से

का चयन करें मूल्य;

value 
1 
3 
13 
1 
5 

ताकि मैं इस परिणाम है मैं एक संचायक स्तंभ जोड़ने के लिए करना चाहते हैं:

value accumulated 
1  1 
3  4 
13  17 
1  18 
5  23 

मैं यह कैसे कर सकते हैं? मैं क्या करना चाहता हूं इसका वास्तविक नाम क्या है? धन्यवाद

उत्तर

11

इस तरह का प्रयास करें:

select value, 
(select sum(t2.value) from table t2 where t2.id <= t1.id) as accumulated 
from table t1 

लेकिन अगर यह आपके डेटाबेस पर काम नहीं करेगा, बस कुछ

select value, 
(select sum(t2.value) from table t2 where t2.id <= t1.id order by id) as accumulated 
from table t1 
order by id 

इस दैवज्ञ पर काम करता है के द्वारा आदेश जोड़ने;) लेकिन यह एक पर होना चाहिए sqlite भी

+0

क्या यह ऑर्डर करने के लिए आईडी के बिना किसी तालिका पर काम करता था (या सख्त <या अद्वितीय <= तुलना) की संभावना के बिना किसी अन्य मानदंड के बाद ऑर्डर करना, मैं इस उत्तर को स्वीकार कर लेता ... – moala

+0

आप एक विश्लेषणात्मक क्वेरी के साथ tthis कर सकते हैं जब आप ओरेकल का उपयोग करते हैं, तो कोई भी स्वयं की आवश्यकता नहीं होती है, http://www.orafaq.com/node/55 देखें। अफसोस की बात है कि SQL विश्लेषणात्मक प्रश्नों का समर्थन नहीं करता है। – TTT

1

ऑपरेशन को एक रनिंग योग कहा जाता है। SQLite इसका समर्थन नहीं करता है, लेकिन इसे काम करने के तरीके हैं। एक बस सेबेस्टियन ब्रोज्डा पोस्ट किया गया है। एक अन्य प्रश्न में मैंने एक और here विस्तृत किया।

+0

या "कुल रनिंग"। धन्यवाद। – moala

1

यहां सभी पूर्व पंक्तियों को एकत्र करने की अक्षमता के बिना एक रनिंग कुल बनाने का एक तरीका है। (मैं जानता हूँ कि इस सवाल का 6 साल पुराना है, लेकिन यह SQLite कुल चलाने के लिए पहले गूगल प्रविष्टियों में से एक है।)

create table t1 (value integer, accumulated integer, id integer primary key); 
insert into t1 (value) values (1); 
insert into t1 (value) values (3); 
insert into t1 (value) values (13); 
insert into t1 (value) values (1); 
insert into t1 (value) values (5); 

UPDATE 
    t1 
SET 
    accumulated = ifnull(
    (
     SELECT 
      ifnull(accumulated,0) 
     FROM 
      t1 ROWPRIOR 
     WHERE 
      ROWPRIOR.id = (t1.id -1)),0) + value; 


.headers on 
select * from t1; 
value|accumulated|id 
1|1|1 
3|4|2 
13|17|3 
1|18|4 
5|23|5 

यह केवल सभी मूल्यों आयात करने के बाद एक बार चलाने की जानी चाहिए। या, फिर से चलाने से पहले एकत्रित कॉलम को सभी नल पर सेट करें।

+0

यह बहुत अच्छा काम करता है। मैंने एक बड़ी तालिका ली जो अन्य संचय पैटर्न का विरोध कर रहा था और एक ऑटोपिक्रमेंट के साथ एक अस्थायी तालिका में प्रासंगिक फ़ील्ड्स में चयनित (क्रमशः) के साथ चयनित था, और फिर इस पैटर्न का उपयोग 't1.itemId = ROWPRIOR.itemId' को जोड़कर किया था खंड। हर बार जब यह एक नई वस्तु हिट करता है, तो संचय शुरू होता है। 15s के लिए एक बहु घंटे रन टाइम कटौती। – chad

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