【问题标题】:get previous value in place for null rows为空行获取先前的值
【发布时间】:2015-01-20 22:51:20
【问题描述】:

如果下一行为空,我有没有办法获得前一个值? 我的数据库是这样的

|           tstamp      | val1 | val2 |
|   2015-01-21 01:00:00 | 15.2 | 25.1 |
|   2015-01-21 01:30:00 | null | null |
|   2015-01-21 02:00:00 | null | 14.1 |
|   2015-01-21 02:30:00 | 11.2 | null |
|   2015-01-21 03:00:00 | null | 21.1 |
|   2015-01-21 03:30:00 | 12.2 | 13.1 |

目前我唯一的查询是只获取最后一行,即 12.2 和 13.1

SELECT tstamp, val1, val2
FROM table
WHERE id IN (1,2) AND
tstamp  BETWEEN "2015-01-21 00:00:00" AND "2015-01-21 23:00:00"

GROUP BY DATE(tstamp), HOUR(tstamp), MINUTE(tstamp) DIV 30
ORDER BY tstamp DESC
LIMIT 1

我想要的输出是

如果我使用它,我得到的结果是

|           tstamp      | val1 | val2 |
|   2015-01-21 01:00:00 | 15.2 | 25.1 |
|   2015-01-21 01:30:00 | 15.2 | 25.1 |
|   2015-01-21 02:00:00 | 15.2 | 14.1 |
|   2015-01-21 02:30:00 | 11.2 | 14.1 |
|   2015-01-21 03:00:00 | 11.2 | 21.1 |
|   2015-01-21 03:30:00 | 12.2 | 13.1 |

有什么办法可以让它工作吗?

谢谢。

【问题讨论】:

  • 是的,就像 1:30 和 2:00 我想从 1:00 = 15.2 获取最后一个值,然后对于下一个空值 3:00 我想从 2 获取值:30 即 11.2
  • 对于 val2 列也是如此,1:30 的值应该是 1:00 的值,然后 2:30 的值应该是 2:00 的值
  • val1 是 MIN 列,val2 是 MAX
  • 喜欢股市的低点和高点?
  • 所以你最终可能会得到一个实际上高于它的“高”的“低”?!?!?

标签: mysql


【解决方案1】:
select
    tstamp,
    if(val1 is null,@prevVal1,@prevVal1:=val1),
    if(val2 is null,@prevVal2,@prevVal2:=val2)
from t;

:= 运算符为变量赋值并返回该值。

【讨论】:

  • 你也需要分配变量
  • @Strawberry - 我不确定我是否跟随。正在分配变量。
  • 但是它们没有被初始化。我认为你的意思是“val2”
  • 如果需要,可以在之前的查询中将它们初始化为所需的值。如果未初始化,它们将返回 null,如果第一个值不存在,这可能是预期的结果。
  • @strawberry 很酷。如果第一行没有值,您将得到一个空值,因为未分配 UDV。听起来很合理。
【解决方案2】:

正在调整 atxdba 的其他出色解决方案...

SELECT tstamp 
     , IF(val1 is null,@prevVal1,@prevVal1:=val1)
     , if(val2 is null,@prevVal2,@prevVal2:=val2) 
  from my_table
     , (SELECT @preVal1:=null,@preVal2:=null) vars
  ORDER 
     BY tstamp;

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2022-11-02
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2017-03-22
    • 2018-12-03
    相关资源
    最近更新 更多