2016-07-08 40 views
0

累積データを表示し、条件に基づいてカウントをリセットできますか? セル番号に値1がある場合に累積するスクリプトを作成したいのですが、別の値を指定するとカウントを再開する必要があります。 cumulative_with_condition列に表示されるものと同じもの。SQLクエリ条件付き累積

+----+------------+--------+ 
| id | release | number | 
+----+------------+--------+ 
| 1 | 2016-07-08 | 4  | 
| 2 | 2016-07-09 | 1  | 
| 3 | 2016-07-10 | 1  | 
| 4 | 2016-07-12 | 2  | 
| 5 | 2016-07-13 | 1  | 
| 6 | 2016-07-14 | 1  | 
| 7 | 2016-07-15 | 1  | 
| 8 | 2016-07-16 | 2-3 | 
| 9 | 2016-07-17 | 3  | 
| 10 | 2016-07-18 | 1  | 
+----+------------+--------+ 

select * from version where id > 1 and id < 9; 
+----+------------+--------+---------------------------+ 
| id | release | number | cumulative_with_condition | 
+----+------------+--------+---------------------------+ 
| 2 | 2016-07-09 | 1  | 1       | 
| 3 | 2016-07-10 | 1  | 2       | 
| 4 | 2016-07-12 | 2  | 0       | 
| 5 | 2016-07-13 | 1  | 1       | 
| 6 | 2016-07-14 | 1  | 2       | 
| 7 | 2016-07-15 | 1  | 3       | 
| 8 | 2016-07-16 | 2-3 | 0       | 
+----+------------+--------+---------------------------+ 
+0

MySQLでは可能ですが、他のRDBMS製品と異なり、分析機能はサポートしていません。おそらく、これをアプリケーションコード内で実装することをお勧めします。 – eggyal

+0

これはMySQLでユーザ変数を使って行うことができます。 – Shadow

+1

[リセット条件付き累積合計のMySQL計算]の可能な複製(http://stackoverflow.com/questions/31885375/mysql-calculation-of-cumulative-sum-with-a-reset-condition) – Shadow

答えて

1

あなたはrow_number()(ない正確に、しかし、そのような)のような何かをしたいです。 、

select t.*, 
     (@rn := if(number = 1, @rn + 1, 
        if(@n := number, 0, 0) 
       ) 
     ) as cumulative_with_condition 
from t cross join 
    (select @n := '', @rn := 0) params 
order by t.id; 
+0

私はこの質問を別のものと重複して表示しましたが、正確に同じ回答を提供しています。 – Shadow

1

をユーザー変数を使用する代わりに、ゴードン・リノフによって示されるように、この場合には、それは、自己結合することも可能ですグループと数える:あなたは、変数を使用することを行うことができます

SELECT t.id, t.release, t.number, COUNT(version.id) AS cumulative_with_condition 
FROM  version RIGHT JOIN (
      SELECT highs.*, MAX(lows.id) min 
      FROM  version lows RIGHT JOIN version highs ON lows.id <= highs.id 
      WHERE lows.number <> '1' 
      GROUP BY highs.id 
     ) t ON version.id > t.min AND version.id <= t.id 
WHERE t.id > 1 AND t.id < 9 
GROUP BY t.id 

sqlfiddleでそれを見てください。

しかし、率直に言えば、どちらのアプローチも特に優雅ではありません。これまでコメントしたように、おそらくアプリケーションコード内でこれを実装するのが最良です。

+0

あなたの答えをありがとう。優雅さについては、私の心配は最適化です。あなたの意見では、私のアプリに実装されて最適化されるか、あなたのアプローチを使用しますか? – fenix

+0

@fenix:メンテナンス性に関心を持つ方がよいでしょう。 Knuthの格言を覚えておいてください。 "*時期尚早の最適化はすべての悪の根源です。*" – eggyal

+0

あなたの提案はこの段階で非常に貴重です。 – fenix