4

外部のサードパーティ プログラムを使用してデータベースをリアルタイムで mysql にエクスポートし、レポート用にデータを表示したいと考えています。リアルタイムで同期しているので、構造を変更することはできません。

テーブル構造はこんな感じ

ID | Date       | Transaction
-----------------------------
12 | 2012-11-01 | 200
12 | 2012-11-02 | 250
12 | 2012-11-03 | 150
12 | 2012-11-04 | 1000
12 | 2012-11-05 | 225
....
13 | 2012-11-01 | 175
13 | 2012-11-02 | 20
13 | 2012-11-03 | 50
13 | 2012-11-04 | 100
13 | 2012-11-05 | 180
13 | 2012-11-06 | 195

データは非常に大きく、毎日大きくなっています。

私がやりたいことは、次のようなものに基づいてレポート (ビュー テーブル) を作成することです。

ID | Date       | Transaction | Prev Day Transaction
----------------------------------------------------
12 | 2012-11-01 | 200         | 0
12 | 2012-11-02 | 250         | 200
12 | 2012-11-03 | 150         | 250
12 | 2012-11-04 | 1000        | 150
12 | 2012-11-05 | 225         | 1000
....
13 | 2012-11-01 | 175         | 0
13 | 2012-11-02 | 20          | 175
13 | 2012-11-03 | 50          | 20
13 | 2012-11-04 | 100         | 50
13 | 2012-11-05 | 180         | 100
13 | 2012-11-06 | 195         | 180

高速な選択ステートメントを取得できません。現在、元のデータはすでに 283,120 行です。そして、毎日500行のように成長します。

私は次のようなことを試しました:

SELECT *, (SELECT transaction FROM table as t2 WHERE t1.id=t2.id 
AND t1.date>t2.date ORDER BY t2.date DESC LIMIT 0,1)
FROM table AS t1

動作していますが、選択ステートメントは非常に遅いです。ほとんどの場合、操作の途中で切断されます。

私が助けを必要としているのは、後でビュー テーブルを作成するために使用できる非常に高速な SQL ステートメントです。

4

4 に答える 4

3

このリンクを参照してください:http ://sqlfiddle.com/#!2 / 54a5e / 12

select t.id,t.cDate,t.cTrans
  ,(case when @pID=t.id then @pTran else 0 end) as preT 
  ,(@pID :=t.id) as `tID`,(@pTran := t.cTrans) as `tTrans` 
from tb_test_1 as t,(select @pID = 0, @pTran = 0) as t2
order by id,cDate;

tIDtTrans列は保持する必要があり、ページに表示することはできません。

私は英語が少ししかわからないので許してください!

于 2012-11-27T03:12:18.020 に答える
2

このクエリを試してください -

SELECT t1.*, COALESCE(t2.transaction, 0) Prev_Day_Transaction FROM trans t1
  LEFT JOIN (SELECT * FROM trans ORDER BY id, date DESC) t2
    ON t1.id = t2.id AND t1.date > t2.date
GROUP BY t1.id, t1.date;

+------+------------+-------------+----------------------+
| id   | date       | transaction | Prev_Day_Transaction |
+------+------------+-------------+----------------------+
|   12 | 2012-11-01 |         200 |                    0 |
|   12 | 2012-11-02 |         250 |                  200 |
|   12 | 2012-11-03 |         150 |                  250 |
|   12 | 2012-11-04 |        1000 |                  150 |
|   12 | 2012-11-05 |         225 |                 1000 |
|   13 | 2012-11-01 |         175 |                    0 |
|   13 | 2012-11-02 |          20 |                  175 |
|   13 | 2012-11-03 |          50 |                   20 |
|   13 | 2012-11-04 |         100 |                   50 |
|   13 | 2012-11-05 |         180 |                  100 |
|   13 | 2012-11-06 |         195 |                  180 |
+------+------------+-------------+----------------------+

テーブルに複合インデックス (id、日付) を追加します。

===========================

ALTER TABLE mt4_daily
  ADD INDEX IX_mt4_daily_DATE (DATE);

ALTER TABLE mt4_daily
  ADD INDEX IX_mt4_daily (ID, DATE);
于 2012-11-26T07:40:38.583 に答える
1

私は次のようにクエリを書き込もうとします:

SELECT
  tbl.ID,
  tbl.Date,
  tbl.Transaction,
  COALESCE(tbl1.Transaction,0) as PrevDay
FROM
  tbl left join tbl tbl1
  on tbl.ID = tbl1.ID
     and tbl.Date = tbl1.Date + INTERVAL 1 DAY

(これは、テーブルにすべての日が含まれていることを確認した場合にのみ機能します。1 日を逃した場合、翌日は常に PrevDay が 0 として表示されます。これが必要かどうかはわかりません)。

編集:数日が欠落している場合でも機能するこのソリューションを試してみます:

SELECT
  tbl.id,
  tbl.date,
  tbl.Transaction,
  COALESCE(tbl1.Transaction,0) as PrevDay
FROM
  (SELECT tbl.id, tbl.date as d1, max(tbl1.ddate) as d2
   FROM tbl LEFT JOIN tbl tbl1
        ON tbl.id = tbl1.id and tbl.date>tbl1.date
   GROUP BY tbl.id, tbl.date) t
  LEFT JOIN tbl on tbl.id = t.id and DATE(tbl.ddate) = DATE(t.d1)
  LEFT JOIN tbl tbl1 ON tbl1.id = t.id and DATE(tbl1.date) = DATE(t.d2)
于 2012-11-26T07:41:17.523 に答える
1

select ステートメントを使用してテーブルをいくつかの部分に分割し、UNION Set 演算子を使用してそれらを結合します。すべてのセット演算子は並列操作であるため、データを非常に迅速に取得できます。テーブルの一意の数値列を使用して、データを分割できます。例えば

select * from tbl_x where col1%3=0 union
select * from tbl_x where col1%3=1 union
select * from tbl_x where col1%3=2 ...

上記のSQLクエリは、データを分割し、並行してフェッチします

于 2012-11-26T07:30:00.727 に答える