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番目の引数、テーブルの列への参照だけを残します。