【问题标题】:MySQL dividing current row with current row + 1MySQL将当前行与当前行+ 1分开
【发布时间】:2015-10-28 10:23:09
【问题描述】:

我的 MySQL 查询有问题。我有两张表,表货币和表currency_detail。表currency 包含货币代码,例如USD、EUR、IDR 等。表currency_detail 包含日期和汇率。在加入表格以获取 1 年内的所有汇率美元后,我的数据如下所示:

Date       | Rate
-------------------
2015-10-20 | 14463
2015-10-19 | 14452
2015-10-18 | 14442
2015-10-15 | 14371
2015-10-14 | 14322
2015-10-10 | 14306
2015-10-08 | 14322

我需要用当前行 + 1 来计算每一行。是否可以获得看起来像这样的结果?

Date       | Rate  | PX
------------------------------
2015-10-20 | 14463 | 0.000761     -> LN(14463/14452)
2015-10-19 | 14452 | 0.000692     -> LN(14452/14442)
2015-10-18 | 14442 | 0.004928     -> LN(14442/14371)
2015-10-15 | 14371 | 0.003415     -> LN(14371/14322)
2015-10-14 | 14322 | 0.001118     -> LN(14322/14306)
2015-10-10 | 14306 | -0.00112     -> LN(14306/14322)
2015-10-08 | 14322 | 0            -> 0 (because no data after this row)

我尝试了很多方法,但仍然找不到解决方案。任何人都可以帮助查询?之前谢谢..

【问题讨论】:

  • 你尝试过的方法有哪些。请展示你的所作所为。
  • currency_detail有没有主键

标签: mysql


【解决方案1】:

在标准 SQL 中,您只需使用 LAG 从上一条记录中读取值。在 MySQL 中,您需要一种解决方法。最简单的方法可能是选择所有行两次并即时编号;然后你可以按行号加入:

select
  this.rdate, this.rate,
  ln(this.rate / prev.rate) as px
from
(
  select @rownum1 := @rownum1 + 1 as rownum, rates.* 
  from rates
  cross join (select @rownum1 := 0) init
  order by rdate
) this
left join
(
  select @rownum2 := @rownum2 + 1 as rownum, rates.* 
  from rates
  cross join (select @rownum2 := 0) init
  order by rdate
) prev on prev.rownum = this.rownum - 1
order by this.rdate desc;

顺便说一句,我不得不在两个子查询中使用不同的 rownum 变量名,否则 MySQL 会感到困惑。我认为这是一个缺陷,但我必须承认 MySQL 的 variables-in-SQL 对我来说仍然有点陌生 :-)

SQL 小提琴:http://www.sqlfiddle.com/#!9/341c4/7

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多