2011-03-30 14 views
9

निम्न तालिका पर विचार करें:मैं MySQL में कॉलम कैसे खो सकता हूं?

SELECT id, value FROM table ORDER BY id ASC; 
+-----+---------+ 
| id | value | 
+-----+---------+ 
| 12 | 158  | 
| 15 | 346  | 
| 27 | 334  | 
| 84 | 378  | 
| 85 | 546  | 
+-----+---------+ 

id स्तंभ ऑटो वृद्धि की जाती है, लेकिन अंतराल होता है। value कॉलम संख्यात्मक है।

मैं ऊपर value दो पंक्तियों के संबंध में value की स्थापना करके समय के साथ value में वृद्धि को देखने के लिए चाहते हैं। यह पंक्ति id=85 पंक्ति (334) के value के संबंध में पंक्ति id=85 (546) सेट करना चाहता है। पंक्ति id=85 के लिए गणना की जाने वाली मान 546/334 = 1.63473 है।

SELECT id, value, ...; 
+-----+---------+---------------------+ 
| id | value | value/lag(value, 2) | (the syntax value/lag(value, 2) is made up) 
+-----+---------+---------------------+ 
| 12 | 158  | NULL    | 
| 15 | 346  | NULL    | 
| 27 | 334  | 2.11392    | (334/158=2.11392) 
| 84 | 378  | 1.09248    | (378/346=1.09248) 
| 85 | 546  | 1.63473    | (546/334=1.63473) 
+-----+---------+---------------------+ 

मैं MySQL में इस तरह के चल करते हैं कैसे:

यह परिणाम मैं हासिल करना चाहते हैं?

कृपया ध्यान दें कि id कॉलम में अंतराल है, इसलिए बस t1.id = t2.id - 2 के साथ एक ही तालिका में शामिल होने से काम नहीं करेगा।

+0

वहाँ एसक्यूएल मानक में एक अंतराल() फंक्शन है, लेकिन MySQL इस का समर्थन नहीं करता है। –

उत्तर

9

यहाँ रिटर्न कि क्या आप MySQL में चाहते

SET @a :=0; 
SET @b :=2; 
SELECT r.id, r.value, r.value/r2.value AS 'lag' 
FROM 
(SELECT if(@a, @a:[email protected]+1, @a:=1) as rownum, id, value FROM results) AS r 
LEFT JOIN 
(SELECT if(@b, @b:[email protected]+1, @b:=1) as rownum, id, value FROM results) AS r2 
ON r.rownum = r2.rownum 

MySQL 5.1 एक आत्म पसंद नहीं करता है एक सबक्वेरी के खिलाफ में शामिल होने ताकि आप दो बार पंक्तियों गिनती करने के लिए है, तो के रूप में साफ है या यह रूप में स्केलेबल नहीं एक समाधान है हो सकता है, लेकिन यह अंतराल को सरल बना देता है।

पाठकों कि Oracle का उपयोग करने के बजाय इस बहुत आसान

SELECT id, value, value/lag(value, 2) over (order by id) as lag from results; 
+3

* उन पाठकों के लिए जो ओरेकल *: या पोस्टग्रेएसक्यूएल या डीबी 2 या टेराडाटा :) –

0

वर्तमान एक और जहां 'ऐतिहासिक' डेटा आप perphaps चर का उपयोग कर सकता है अस्थायी रूप से की तरह कुछ का उपयोग कर डेटा स्टोर करने के लिए प्राप्त करना चाहते हैं से एक के बीच केवल दो पंक्तियों देखते हैं के रूप में:

set @oldid0=999999;
set @oldid1=999999;
set @oldid2=999999;
select @oldid0:[email protected],@oldid1:[email protected],@oldid2:=id, value/@oldid0 from table order by id asc;

यह एक बहुत ही अवांछित समाधान है लेकिन मुझे लगता है कि यह काम करेगा। शायद चर को प्रदर्शित होने से रोकने का कोई तरीका है, मैंने इसे अब तक नहीं देखा है।

+0

लग (2) सिर्फ एक उदाहरण है। मैं एक सामान्य समाधान की तलाश में हूं जो लैग (365) :-) – knorv

+0

आह कहने की अनुमति देगा, मैंने आपका प्रश्न पढ़ा और बेवकूफ रूप से माना कि आप केवल अंतराल (2) – blankabout

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