簡単な方法はありません。自己結合を使用する必要があります。
select t.*,
(coalesce(t_1.count, 0) - coalesce(t_2.count, 0)) * 100.0
from t left outer join
t t_1
on t.id = t_1.id + 1 left outer join
t t_2
on t.id = t_2.id + 2
はleft outer join
、先行するIDがない場合でも、すべての元の行が残ることを確認します。
これは、IDがシーケンシャルであるために機能します。IDが連続しておらず、カウントが単調に増加している場合は、相関サブクエリを使用してこれを行うことができます。
select t.*,
(coalesce((select max(`count`) as val
from table1 t_1
where t_1.`count` < t.`count`
), 0)
) -
(coalesce((select max(`count`)
from table1 t_2
where t_2.`count` < (select max(`count`) from table1 t_1 where t_1.`count` < t.`count`)
), 0)
)
from table1 t
注:2つの値が連続して同じである場合、これは正しく機能しません。そのためには、代わりにidを使用する必要があります。
select t.*,
(coalesce((select max(`count`) as val
from table1 t_1
where t_1.`id` < t.`id`
), 0)
) -
(coalesce((select max(`count`)
from table1 t_2
where t_2.`id` < (select max(`id`) from table1 t_1 where t_1.`id` < t.`id`)
), 0)
)
from table1 t
カウントが増加していない場合は、IDを取得し、値を再度結合する必要があります。なんて楽しい!コードは次のとおりです。
select t.*,
coalesce(t1.count, 0) - coalesce(t2.count, 0)
from (select t.*,
(select max(`id`) as id1 from table1 t_1 where t_1.`id` < t.`id`
) as id1,
(select max(`count`) from table1 t_2
where t_2.`id` < (select max(`id`) from table1 t_1 where t_1.`id` < t.`id`)
) id2
from table1 t
) t left outer join
table1 t1
on t.id1 = t1.id left outer join
table1 t2
on t.id2 = t2.id