mysql - sql按年计算变化和百分比

标签 mysql sql

我有一个模拟交易账户返回率的数据集。每天都有一个条目显示余额和未平仓权益。我想计算每年、每季度或每月的变化以及 yield 或损失百分比。我可以将其用于每日数据,但由于某种原因,我似乎无法将其用于年度数据。 每日数据代码如下:

SELECT b.`Date`, b.Open_Equity, delta, 
       concat(round(delta_p*100,4),'%') as delta_p 
FROM  (SELECT *,
          (Open_Equity - @pequity) as delta,
          (Open_Equity - @pequity)/@pequity as delta_p,
          (@pequity:= Open_Equity)
       FROM tim_account_history p
          CROSS JOIN
            (SELECT @pequity:= NULL
             FROM tim_account_history
             ORDER by `Date` LIMIT 1) as a
       ORDER BY `Date`) as b
ORDER by `Date` ASC

按年份分组(日期)似乎没有产生预期的差异。我已经尝试了我能想到的一切,但即使您按月或年等分组,它似乎仍然返回每日变化率。我认为我没有正确使用窗口,但我似乎无法弄清楚。如果有人知道一本关于此类查询的好书,我也将不胜感激。 谢谢。 sqlfiddle example

<小时/>

利用 Lolo 贡献的内容,我添加了一些代码,以便数据来自一年的最后一天,而不是第一天。我也只需要 Open_Equity,而不是总和。

我仍然不确定我理解为什么它有效,但它确实给了我我正在寻找的东西。使用另一个 select 语句作为 from 似乎是这里的关键;如果没有洛洛的帮助,我想我不会想出这个办法。谢谢。

SELECT b.`yyyy`, b.Open_Equity, 
    concat('$',round(delta, 2)) as delta,
    concat(round(delta_p*100,4),'%') as delta_p 
FROM   (SELECT *,
          (Open_Equity - @pequity) as delta,
          (Open_Equity - @pequity)/@pequity as delta_p,
          (@pequity:= Open_Equity)
        FROM (SELECT (EXTRACT(YEAR FROM `Date`)) as `yyyy`, 
                (SUBSTRING_INDEX(GROUP_CONCAT(CAST(`Open_Equity` AS CHAR) ORDER BY `Date` DESC), ',', 1 )) AS `Open_Equity`
            FROM tim_account_history GROUP BY `yyyy` ORDER BY `yyyy` DESC) p
            CROSS JOIN
            (SELECT @pequity:= NULL) as a
       ORDER BY `yyyy` ) as b
ORDER by `yyyy` ASC

最佳答案

试试这个:

SELECT b.`Date`, b.Open_Equity, delta, 
       concat(round(delta_p*100,4),'%') as delta_p 
FROM  (SELECT *,
          (Open_Equity - @pequity) as delta,
          (Open_Equity - @pequity)/@pequity as delta_p,
          (@pequity:= Open_Equity)
       FROM (SELECT YEAR(`Date`) `Date`, SUM(Open_Equity) Open_Equity FROM tim_account_history GROUP BY YEAR(`Date`)) p
          CROSS JOIN
            (SELECT @pequity:= NULL) as a
       ORDER BY `Date` ) as b
ORDER by `Date` ASC

关于mysql - sql按年计算变化和百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911099/

相关文章:

php - 将 CSV 文件转换为 Mysql 数据库 PHP

javascript - 如何使用将响应发送回ajax并单独处理每个响应

c# - 从数据库中删除选定的数据表行

mysql - 如何获取触发器的插入值

c# - 无法从 C# 表单应用程序连接到本地数据库 (mdf)

php - SQLSTATE[HY000] : General error: 1364 Field 'author_id' doesn't have a default value

php - 单击删除按钮后删除单个数据库行

mysql - 给定第一个查询后,最常见的第二个查询 - SQL 分组

mysql - MariaDB 使用哪种 SQL 变体?

mysql - 为什么 FOUND_ROWS() 对于 5.7.17 SQL 版本返回错误结果?