MySQL 8 . के लिए फिर Lag का उपयोग करें विंडो फ़ंक्शन।
SELECT
test.id,
test.date,
test.number,
test.qty,
IFNULL(test.number - LAG(test.number) OVER w, 0) AS diff,
ROUND(IFNULL(test.number - LAG(test.number) OVER w, 0)/ test.qty, 2) AS 'Avg'
FROM purchases test
WINDOW w AS (ORDER BY test.`date` ASC);
MySQL 5.7 या उससे कम संस्करण के लिए
हम MySQL वैरिएबल
का इस्तेमाल कर सकते हैं इस काम को करने के लिए। अपनी तालिका के नाम पर विचार करें test
. है ।
SELECT
test.id,
test.date,
test.number,
test.qty,
@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff,
ROUND(@diff / qty, 2) 'avg',
@prev_number:= test.number as dummy
FROM
test,
(SELECT @prev_number:= 0 AS num) AS b
ORDER BY test.`date` ASC;
-------------------------------------------------------------------------------
Output:
| id | date | number| qty | diff | avg | dummy |
-----------------------------------------------------------------
| 114 | 2018-10-07 | 200 | 5 | 0 | 0.00 | 200 |
| 120 | 2018-12-01 | 300 | 10 | 100 | 10.00 | 300 |
| 123 | 2019-02-03 | 700 | 12 | 400 | 33.33 | 700 |
| 1126 | 2019-03-07 | 1000 | 15 | 300 | 20.00 | 1000 |
व्याख्या:
(SELECT @prev_number:= 0 AS num) AS b
हमने वैरिएबल @prev_number . को इनिशियलाइज़ किया है FROM खंड में शून्य करने के लिए और परीक्षण . की प्रत्येक पंक्ति के साथ जुड़ गया टेबल.@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
पहले हम अंतर पैदा कर रहे हैं और फिर एक और वैरिएबल diff . बनाया है औसत गणना के लिए इसका पुन:उपयोग करने के लिए। साथ ही हमने पहली पंक्ति के अंतर को शून्य बनाने के लिए एक शर्त भी शामिल की।@prev_number:= test.number as dummy
हम वर्तमान नंबर setting सेट कर रहे हैं इस चर के लिए, इसलिए इसे अगली पंक्ति द्वारा उपयोग किया जा सकता है।
नोट :हमें पहले इस चर का उपयोग करना होगा, दोनों अंतर . में साथ ही औसत और फिर नए मान पर सेट करें, ताकि अगली पंक्ति पिछली पंक्ति से मान तक पहुंच सके।
आप order by
को छोड़/संशोधित कर सकते हैं आपकी आवश्यकताओं के अनुसार खंड।