web-dev-qa-db-ja.com

線形成長レポートを生成する

私のテーブルには次のデータがあります。

2016-01-01 : 1
2016-01-02 : 0
2016-01-03 : 4
2016-01-04 : 1
2016-01-05 : 2

次のようなレポート(線形成長)を生成したいと思います。

date       : linear growth
2016-01-01 : 1
2016-01-02 : 1
2016-01-03 : 5
2016-01-04 : 6
2016-01-05 : 8

これを行うためのSQLステートメントの良いアイデアはありますか?

3
Dick Pan

MySQLはSUM(...) OVER(...)などのウィンドウ関数をサポートしていませんが、変数、自己結合、またはサブクエリを使用して計算できます。

質問のサンプルを使用したクエリ

変数

SELECT created, value
    , @growth := @growth + value as growth
FROM data
  , (SELECT @growth := 0 as growth) as v
ORDER BY created

出力

| created                   | value | growth |
|---------------------------|-------|--------|
| January, 01 2016 00:00:00 |     1 |      1 |
| January, 02 2016 00:00:00 |     0 |      1 |
| January, 03 2016 00:00:00 |     4 |      5 |
| January, 04 2016 00:00:00 |     1 |      6 |
| January, 05 2016 00:00:00 |     2 |      8 |

自己参加

これは、self JOINを使用して実行することもできます。

SELECT d1.created, d1.value
    , SUM(d2.value) as growth
FROM data d1
INNER JOIN data d2
    ON d1.created >= d2.created
GROUP BY d1.created, d1.value
ORDER BY d1.created;

サブクエリ

またはサブクエリを使用:

SELECT d1.created, d1.value
    , (
      SELECT SUM(value) 
      FROM data
      WHERE created <= d1.created
    ) as growth
FROM mydata d1
ORDER BY d1.created;
  • この SQL Fiddle には、両方のクエリ(変数、自己結合、およびサブクエリ)が含まれます

いくつかのIDの増加を伴うクエリ

変数

複数のIDの増加を計算する場合は、追加の@id変数とCASEステートメントを追加できます。

SELECT created, value
    , CASE WHEN @id <> d.id THEN @growth := value 
        ELSE @growth := @growth + value
      END as growth
    , @id := d.id as id
FROM data d
  , (SELECT @growth := 0 as growth, @id := 0 as id) as v
ORDER BY d.id, d.created;

自己参加

SELECT d1.created, d1.value
    , SUM(d2.value) as growth
    , d1.id
FROM data d1
INNER JOIN data d2
    ON d1.created >= d2.created AND d1.id = d2.id
GROUP BY d1.created, d1.value, d1.id
ORDER BY d1.created;

サブクエリ

SELECT d1.id, d1.created, d1.value
    , (
      SELECT SUM(value) 
      FROM data
      WHERE created <= d1.created AND id = d1.id
    ) as growth
FROM data d1
ORDER BY d1.id, d1.created;
  • この SQL Fiddle ID(変数、自己結合、またはサブクエリ)による拡張の両方のクエリが含まれています
4