2016-04-17 5 views
0

20列20行のReferencesという名前のテーブルがあります。20列20行のMySQLテーブルの連続する行の差に値(-1、0、1)を割り当てる方法

CREATE TABLE bop_ppy 
(start_time DATETIME (6) 
, end_time DATETIME (6) 
, high DECIMAL (5,2) 
, low DECIMAL (5,2) 
, close DECIMAL (5,2) 
, vol DECIMAL (5,2) 
, vol_avg DECIMAL (5,2) 
, range_ DECIMAL (5,2) 
, poc_ DECIMAL (5,2) 
, va_h DECIMAL (5,2) 
, va_l DECIMAL (5,2) 
, va_range DECIMAL (5,2) 
, tpot INT 
, tpo_ab INT 
, tpo_bl INT 
, sf DECIMAL (5,2) 
, tff DECIMAL (5,2) 
, rf INT 
, vty DECIMAL (5,2) 
, dists INT). 

データは毎日更新されます。

start_time列とend_time列(1日増分されます)を除く各列の連続する行の差を計算する必要があります.2日目の値が1日目の値よりも高い場合は、差に+1を割り当てる。 2日目の値が1日目の値よりも小さい場合は、その差に-1を代入します。 2日目の値が1日目の値と等しい場合は、その差に0を代入します。元の値ではなく、集計のみを表示する新しいテーブル/ビューを生成することです。

各行は1日のデータに対応します。 私はMySQL Workbenchを使用しています。

私は最初にテーブルの自己結合を行い、次に連続する行の違いにダミー変数を割り当てようとしましたが、これまでのところこれは機能しませんでした。私はこの作業をもうどうするのか分かりません。誰か助けてもらえますか?

答えて

0

ORDER BY start_dateがday1、day2の順番で行を取得し、2つの行が同じstart_dateを持ち、start_dateの「ギャップ」に関係しないケースを処理することに心配しない場合は、あなたが探している+1、0、-1、またはNULLの集計を返します。返される最初の行では、前の行は比較されません。したがって、これらの行のdiff_値はすべてNULLになります。

SELECT d.start_date 
    , d.diff_high 
    , d.diff_low 
    , d.diff_close 
    , d.diff_vol 
    , d.diff_vol_avg 
    , d.diff_range_ 
    , d.diff_poc_ 
    , d.diff_va_h 
    , d.diff_va_l 
    , d.diff_va_range 
    , d.diff_tpot 
    , d.diff_tpo_ab 
    , d.diff_tpo_bl 
    , d.diff_sf 
    , d.diff_tff 
    , d.diff_rf 
    , d.diff_vty 
    , d.diff_dists 
    FROM (SELECT t.start_date 
       , SIGN(IFNULL(t.high  ,@high ) - @high ) AS diff_high 
       , SIGN(IFNULL(t.low  ,@low  ) - @low  ) AS diff_low 
       , SIGN(IFNULL(t.close ,@close ) - @close ) AS diff_close 
       , SIGN(IFNULL(t.vol  ,@vol  ) - @vol  ) AS diff_vol 
       , SIGN(IFNULL(t.vol_avg ,@vol_avg ) - @vol_avg ) AS diff_vol_avg 
       , SIGN(IFNULL(t.range_ ,@range_ ) - @range_ ) AS diff_range_ 
       , SIGN(IFNULL(t.poc_  ,@poc_ ) - @poc_ ) AS diff_poc_ 
       , SIGN(IFNULL(t.va_h  ,@va_h ) - @va_h ) AS diff_va_h 
       , SIGN(IFNULL(t.va_l  ,@va_l ) - @va_l ) AS diff_va_l 
       , SIGN(IFNULL(t.va_range ,@va_range) - @va_range) AS diff_va_range 
       , SIGN(IFNULL(t.tpot  ,@tpot ) - @tpot ) AS diff_tpot 
       , SIGN(IFNULL(t.tpo_ab ,@tpo_ab ) - @tpo_ab ) AS diff_tpo_ab 
       , SIGN(IFNULL(t.tpo_bl ,@tpo_bl ) - @tpo_bl ) AS diff_tpo_bl 
       , SIGN(IFNULL(t.sf  ,@sf  ) - @sf  ) AS diff_sf 
       , SIGN(IFNULL(t.tff  ,@tff  ) - @tff  ) AS diff_tff 
       , SIGN(IFNULL(t.rf  ,@rf  ) - @rf  ) AS diff_rf 
       , SIGN(IFNULL(t.vty  ,@vty  ) - @vty  ) AS diff_vty 
       , SIGN(IFNULL(t.dists ,@dists ) - @dists ) AS diff_dists 
       , @high  := t.high  AS c1 
       , @low  := t.low  AS c2 
       , @close  := t.close AS c3 
       , @vol  := t.vol  AS c4 
       , @vol_avg := t.vol_avg AS c5 
       , @range_  := t.range_ AS c6 
       , @poc_  := t.poc_  AS c7 
       , @va_h  := t.va_h  AS c8 
       , @va_l  := t.va_l  AS c9 
       , @va_range := t.va_range AS c10 
       , @tpot  := t.tpot  AS c11 
       , @tpo_ab  := t.tpo_ab AS c12 
       , @tpo_bl  := t.tpo_bl AS c13 
       , @sf   := t.sf  AS c14 
       , @tff  := t.tff  AS c15 
       , @rf   := t.rf  AS c16 
       , @vty  := t.vty  AS c17 
       , @dists  := t.dists AS c18 
      FROM (SELECT @high  := NULL 
         , @low  := NULL 
         , @close  := NULL 
         , @vol  := NULL 
         , @vol_avg := NULL 
         , @range_  := NULL 
         , @poc_  := NULL 
         , @va_h  := NULL 
         , @va_l  := NULL 
         , @va_range := NULL 
         , @tpot  := NULL 
         , @tpo_ab  := NULL 
         , @tpo_bl  := NULL 
         , @sf   := NULL 
         , @tff  := NULL 
         , @rf   := NULL 
         , @vty  := NULL 
         , @dists  := NULL 
       ) i 
      CROSS 
      JOIN bop_ppy t 
      ORDER BY t.start_time 
     ) d 
ORDER BY d.start_time 

あなたがゼロで、これらのNULL値を置き換えたい場合は、IFNULL(式expr、0)と外側のクエリで式をラップすることができます。

これは、列のNULL値を「変更なし」を表すものとして処理します。これは以前の値と同じです。 (値が不明であれば、それが高いか低いかわかりません)

ゼロを必要としない場合は、NULLを戻したい場合は、IFNULLラッパー関数と2番目の引数、テーブルの列への参照だけを残します。

0

通常はインデックスによって行われますが、データは毎日更新されるため、日付を使用して再生することができます。そのためには、単純なネストされた選択を実行する必要があります。これは次のようなものです:

Select start_time, high - (select distinct high from table as b where TO_DAYS(a.start_time)-TO_DAYS(b.start_time)=1) from table as a 

これは高い例です。自由に外挿するようにしてください。

この意味は、行ごとに別の選択を行い、1日の時間差を持つレコードを探します。次に、そのレコードの値を現在のレコードと比較します。

結果を反転する必要がある場合は、1を-1に置き換えます。

関連する問題