我有一个模拟交易账户返回率的数据集。每天都有一个条目显示余额和未平仓权益。我想计算每年、每季度或每月的变化以及 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/