سؤال

لنفترض أن لدي هذا الرمز

create temporary table somedata (a integer);
insert into somedata (a) values (11), (25), (62); --#these values are always increasing
select * from somedata;

إعطاء هذا

+--+
|a |
+--+
|11|
|25|
|62|
+--+

كيف يمكنني حساب عمود من القيم "ب" حيث كل واحد هو الفرق بين قيمة "A" في الصف الحالي وقيمة "A" في الصف السابق؟

+--+--+
|a |b |
+--+--+
|11| 0| # ie 11-11 since theres no preceding row
|25|14| # ie 25-11
|62|37| # ie 62-25 etc
+--+--+

هذا واضح جدا في OpenOffice أو Excel الذي أشعر به سخيف بعض الشيء غير موجود بعد كيفية القيام بذلك على موقع MySQL ولا في أي مكان آخر.

هل كانت مفيدة؟

المحلول

من الأسهل إذا كان لديك عمود Auto_inctrement لإعطاء كل صف هو المعرف الخاص به - ثم يمكنك الانضمام إلى الجدول مقابل نفسه على (الاسم المستعار 2.ID = Alias1.ID + 1) وحساب الفرق من Alias2.a-Alias1.a

كما هو الحال، أعتقد أن الطريقة الوحيدة هي مع استعلام فرعي للحصول على أكبر قيمة أقل من قيمة الصف الحالي، والتي ستكون غير فعالة للغاية.

لذلك إذا كنت تستطيع، تعديل المخطط الخاص بك!

create table somedata (
    id int auto_increment not null, 
    a integer, 
    primary key(id)
);
insert into somedata (a) values (11), (25), (62); 

select a2.a,ifnull(a2.a-a1.a, 0) as diff  
from somedata  as a1 
right join somedata  as a2 on (a2.id=a1.id+1);

+------+------+
| a    | diff |
+------+------+
|   11 |    0 |
|   25 |   14 |
|   62 |   37 |
+------+------+

استخدم الانضمام الداخلي بدلا من ذلك هو الانضمام الصحيح إذا كنت لا تريد أن أول نتيجة صفرية.

تحرير: انظر هذه المقالة للحصول على تجول أكمل لهذه الفكرة: حساب الاختلافات بين الصفوف المتتالية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top