1

上記のセルを参照するmysqlクエリのヘルプが必要です。
たとえば、次の表では次のようになります。

primary key(id)     day             count           percentage change
1                  monday             1               0  
2                  tuesday            2              (1-0)*100%=100%  
3                  wednesday          5              (2-1)*100%=100%  
4                  thursday           9              (5-2)*100%=300%  
5                  friday             27             (9-5)*100%=400%  

変化率の結果は、カウント列の過去2日間の結果に基づいています。「上の」セルを参照するために主キー(id)を組み込む方法はありますか?

4

1 に答える 1

2

簡単な方法はありません。自己結合を使用する必要があります。

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
于 2012-08-14T18:54:57.513 に答える