如何为具有20列和20行的MySQL表中的连续行之间的差值分配值(-1、0、1)

亚历山大·奥比·戴维斯(Alexander Obi Davids)

我有一个来自MySQL的表,称为“引用”,具有20列和20行:

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分配给该差额。这个想法是生成一个新的表/视图,该表/视图仅显示计数,而不显示原始值。

每行对应一天的数据。我正在使用MySQL Workbench。

我试图先做一个表的自连接,然后为连续的行之间的差异分配哑变量,但是到目前为止这还行不通。我不知道该如何使它工作了。请有人帮忙。

spencer7593

如果ORDER BY start_date将行按day1,day2顺序排列,并且您不关心处理两行具有相同的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值表示为“ no change”,与先前的值相同。(如果该值未知,则不知道该值是高还是低。)

如果您不希望为零,并且想在发生这种情况时返回NULL,则删除IFNULL包装函数和第二个参数,仅保留对表列的引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么为 dx[dir 选择值 {1, 1, 0, -1, -1, -1, 0, 1} 和 {0, 1, 1, 1, 0, -1, -1, -1} ] 和 dy[dir]?

如何在 php 中创建一个有 20 行和 20 列且它们的值为 0 的数组?

获取所有数组的排列[1,1,1,1,1,0,0,0,0]

提取包含0 | 0,0 | 1,1 | 0和1 | 1的文件

有什么办法可以循环通过这些数字:-1 0、1 0、0 -1、0 1

如何使用a [0]-a [0] a [1]-a [0] a [1] a [2]输出数组

用于生成 [((0,0),0), ((0,1),0), ((1,0),0), ((1,1),0)] 的代码实际上给出了 [0 , 0, 0, 1, 1, 0, 1, 1],如何解决?

一次将具有多个行和列的数据框中的所有0值替换为1

python中输出-1或0或1的函数

如何在mongo中查询1 = 1或1 = 0?

如何为{'1','1'}和{'1','1','\ 0'}给相同的输出感到惊讶?

从 (0,1)x(0,1) 到 [0,1]x[0,1] 的连续函数

布尔值从1/0切换到0/1

AMQP 0-9-1和1-0

为什么1/0 = Infinity和1 / -0 = -Infinity

-1和〜0之间有区别吗?

用&1 << 0测试值?

0 和 1 的同心矩阵

明确回报0和1

为什么在Haskell中0 ^ 0 == 1?

bash中1>&0的行为

计划中的0/1背包

过滤序列为0和1的列中的行模式

CSS转换。如何从“ matrix(0,1,-1,0,0,0“)获取旋转度值?

PHP-如何检查字符串是否具有0和1或0或1

如何随机生成具有偶数个 1 或奇数个 0 的 0 和 1 序列?

[0,1]中的GBM连续预测与[0,1]中的Logistic回归连续预测之间有什么区别

在Python中,如何对嵌套列表求和:[[1,0],[1,1],[1,0]]→[3,1]

python中A [0]和A [0:1] numpy数组之间的区别