Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में लगातार पंक्तियों के बीच अंतर कैसे प्राप्त करें?

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 को छोड़/संशोधित कर सकते हैं आपकी आवश्यकताओं के अनुसार खंड।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL ट्रिगर उसी तालिका में पंक्तियों को अपडेट नहीं कर सकते हैं जिसे ट्रिगर को सौंपा गया है। सुझाए गए उपाय?

  2. मैसकल क्वेरी डुप्लिकेट वर्डप्रेस टिप्पणियों को हटाने के लिए?

  3. Mysql में समानांतर लेनदेन

  4. MySQL सभी प्रक्रियाओं की सूची बनाएं

  5. MySQL डेटाबेस में सबसे बड़ी तालिका कैसे खोजें?