1

私はこのテーブルを持っています:

                                 Table "public.transaction"
   Column   |            Type             |                        Modifiers                         
------------+-----------------------------+----------------------------------------------------------
 id         | integer                     | not null default nextval('transaction_id_seq'::regclass)
 account_id | integer                     | 
 note       | character varying           | 
 date       | timestamp without time zone | 
 amount     | numeric                     |

次の形式のトランザクションが含まれます。

 id | account_id |               note               |        date         | amount 
----+------------+----------------------------------+---------------------+--------
  1 |          1 | Loopia AB                        | 2013-02-07 00:00:00 |   -178
  2 |          1 | ÅSGATAN 2 KÖK &                  | 2013-02-07 00:00:00 |   -226
  3 |          1 | BURGER KING ODEN                 | 2013-02-06 00:00:00 |    -89
  4 |          1 | OLEARYS 917                      | 2013-02-06 00:00:00 |   -309
  5 |          1 | TAXI STOCKHOLM                   | 2013-02-06 00:00:00 |   -875
  6 |          1 | GRET INDIAN REST                 | 2013-02-06 00:00:00 |    -85
  8 |          1 | VIDEO RULLEN                     | 2013-02-04 00:00:00 |   -169
  9 |          1 | ICA SUPERMARKET                  | 2013-02-04 00:00:00 |   -196
 10 |          1 | ICA SUPERMARKET                  | 2013-02-03 00:00:00 |   -110

次に、データを次の形式で D3 にフィードします。

[
    {
        "note": "TEXAS LONGHORN",
        "date": "2013-01-10T00:00:00",
        "amount": 110,
        "id": 74,
        "account_id": 1
    },
    {
        "note": "GOOGLE *FEO Medi",
        "date": "2013-01-10T00:00:00",
        "amount": 22,
        "id": 73,
        "account_id": 1
    },
    {
        "note": "Pressbyran 5122",
        "date": "2013-01-10T00:00:00",
        "amount": 13,
        "id": 77,
        "account_id": 1
    },
    {
        "note": "ICA SUPERMARKET",
        "date": "2013-01-10T00:00:00",
        "amount": 106,
        "id": 76,
        "account_id": 1
    },
    {
        "note": "HÅR 3000",
        "date": "2013-01-10T00:00:00",
        "amount": 345,
        "id": 75,
        "account_id": 1
    },
    {
        "note": "Pressbyran 5122",
        "date": "2013-01-11T00:00:00",
        "amount": 19,
        "id": 72,
        "account_id": 1
    },
    {
        "note": "BIRKA PUNKTEN",
        "date": "2013-01-11T00:00:00",
        "amount": 79,
        "id": 71,
        "account_id": 1
    }
]

ただし、D3 ストリームグラフでは、すべてのデータ ポイントが存在する必要があります。したがって、D3 にフィードするデータには、トランザクションのないものも含め、すべての日付を入れる必要があります。

利用可能なツールのいずれかを使用してこれを効率的に行う方法について、ご意見をお待ちしております。http://bl.ocks.org/joar/4747134/a702cf79bf10b1438cc665a2438b3f5cf9ab8bf0で実際の例を試すことができます。

4

1 に答える 1

3

ターゲット地域をカバーする一連の日付が必要generate_seriesな場合は、それに対してトランザクション テーブルを左外部結合します。この SQLFiddle の例を参照してください。

SELECT
  x.gendate,
  t.account_id, t.id, t.note, t.amount
FROM 
  generate_series(
    (SELECT min("date") FROM transaction),
    (SELECT max("date") FROM transaction),
    INTERVAL '1' DAY
  ) AS x(gendate)
  LEFT OUTER JOIN transaction t ON (t."date" = x.gendate)
ORDER BY x.gendate;

この SQLFiddle に従って、PostgreSQL の json 関数を使用して目的のデータ形式を生成できます。

WITH continuous_tx AS (
  SELECT
    x.gendate AS "date",
    t.account_id, t.id, t.note, t.amount
  FROM 
    generate_series(
      (SELECT min("date") FROM transaction),
      (SELECT max("date") FROM transaction),
      INTERVAL '1' DAY
    ) AS x(gendate)
    LEFT OUTER JOIN transaction t ON (t."date" = x.gendate)
  ORDER BY x.gendate
)
SELECT array_to_json(array_agg(continuous_tx ),'t')
FROM continuous_tx;

...グラフ作成ツールにフィードすることはテストしていませんが。

于 2013-02-17T23:23:13.050 に答える