【发布时间】:2021-04-13 20:25:07
【问题描述】:
我有一个 MF_NAVs 表,其中包含共同基金的每日 NAV。我想计算自成立以来 1 天、7 天、15 天、1 个月、3 个月、6 个月、1 年、3 年、5 年和自成立以来的绝对回报。然后将计算的值插入另一个表 MF_Returns。
MF_NAVs 的表结构和示例数据如下所示。我还在以下链接中创建了一个小提琴:https://www.db-fiddle.com/f/fYam96yYZo5tQLGLtcbhaQ/1
我使用下面给出的 SELECT 查询来计算绝对回报。该查询的结果也在下面给出。我的问题是我无法将此查询的结果保存到 MF_RETURNS 表 [结构如下]。
MF_NAVs 表有大约 20k 个不同的 SchemeCode。每个 SchemeCode 都有不同时期的 NAV,从过去几天到几个月不等。
请帮助将计算出的收益保存到 MF_Returns 表中。
查询计算回报:
SELECT SchemeCode,Date,NetAssetValue,
ROUND((((L.LatestNAV)-NetAssetValue)/NetAssetValue)*100,2) AS AbsoluteReturns
FROM MF_NAVs
JOIN (SELECT NetAssetValue AS LatestNAV FROM MF_NAVs WHERE SchemeCode=120503 ORDER BY DATE DESC LIMIT 1) AS L
WHERE SchemeCode=120503
AND FIND_IN_SET(
Date,
(
SELECT
CONCAT_WS( ',',
Y.MaxDate, #LatestDate - MaxDate
DATE_FORMAT(NOW() ,'%Y-01-01'), #YTD - Year To Datw
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 DAY THEN Date END), #1Day
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 7 DAY THEN Date END), #7Day
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 15 DAY THEN Date END), #15Day
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 MONTH THEN Date END), #1Month
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 3 MONTH THEN Date END), #3Month
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 6 MONTH THEN Date END), #6Month
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 YEAR THEN Date END), #1Year
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 3 YEAR THEN Date END), #3Year
MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 5 YEAR THEN Date END), #5Year
MIN(Date) #Inception
)
FROM MF_NAVs
JOIN (SELECT MAX(Date) AS MaxDate FROM MF_NAVs WHERE SchemeCode=120503) AS Y
WHERE SchemeCode=120503
)
)
ORDER BY Date DESC
表结构:MF_NAVs
CREATE TABLE `MF_NAVs` (
`ID` int(11) NOT NULL,
`SchemeCode` int(11) NOT NULL,
`Date` date NOT NULL,
`NetAssetValue` decimal(15,5) NOT NULL
)
示例数据:MF_NAVs
+------------+------------+---------------+
| SchemeCode | Date | NetAssetValue |
+------------+------------+---------------+
| 120503 | 2021-04-13 | 65.59480 |
+------------+------------+---------------+
| 120503 | 2021-04-12 | 65.22200 |
+------------+------------+---------------+
| 120503 | 2021-04-09 | 67.70330 |
+------------+------------+---------------+
| 120503 | 2021-04-08 | 67.89580 |
+------------+------------+---------------+
| 120503 | 2021-04-06 | 66.39850 |
+------------+------------+---------------+
| 120503 | 2021-04-05 | 66.11320 |
+------------+------------+---------------+
| 120503 | 2021-04-01 | 67.03710 |
+------------+------------+---------------+
| 120503 | 2021-03-26 | 65.79040 |
+------------+------------+---------------+
| 120503 | 2021-03-25 | 64.86400 |
+------------+------------+---------------+
| 120503 | 2021-03-12 | 68.38530 |
+------------+------------+---------------+
| 120503 | 2021-03-09 | 68.54100 |
+------------+------------+---------------+
| 120503 | 2021-01-13 | 66.05340 |
+------------+------------+---------------+
| 120503 | 2021-01-12 | 66.90930 |
+------------+------------+---------------+
| 120503 | 2021-01-08 | 66.77000 |
+------------+------------+---------------+
| 120503 | 2021-01-01 | 64.98200 |
+------------+------------+---------------+
| 120503 | 2020-10-13 | 51.78950 |
+------------+------------+---------------+
| 120503 | 2020-10-12 | 52.00310 |
+------------+------------+---------------+
| 120503 | 2020-10-09 | 52.06840 |
+------------+------------+---------------+
| 120503 | 2013-01-02 | 15.02530 |
+------------+------------+---------------+
| 120503 | 2016-04-08 | 29.94380 |
+------------+------------+---------------+
| 120503 | 2016-04-12 | 30.46710 |
+------------+------------+---------------+
| 120503 | 2016-04-13 | 30.94700 |
+------------+------------+---------------+
| 120503 | 2018-04-09 | 44.67440 |
+------------+------------+---------------+
| 120503 | 2018-04-12 | 45.10190 |
+------------+------------+---------------+
| 120503 | 2018-04-13 | 45.18520 |
+------------+------------+---------------+
| 120503 | 2020-04-09 | 43.82900 |
+------------+------------+---------------+
| 120503 | 2020-04-13 | 42.89580 |
+------------+------------+---------------+
表结构:MF_RETURNS
CREATE TABLE MF_RETURNS (
`ID` int(11) NOT NULL,
`SchemeCode` int(11) NOT NULL,
`LatestDate` date NOT NULL,
`YTDDate` date NOT NULL,
`YTDAbsoluteReturns` decimal(15,5) NOT NULL,
`1DayDate` date NOT NULL,
`1DayAbsoluteReturns` decimal(15,5) NOT NULL,
`7DayDate` date NOT NULL,
`7DayAbsoluteReturns` decimal(15,5) NOT NULL,
`15DayDate` date NOT NULL,
`15DayAbsoluteReturns` decimal(15,5) NOT NULL,
`1MonthDate` date NOT NULL,
`1MonthAbsoluteReturns` decimal(15,5) NOT NULL,
`3MonthDate` date NOT NULL,
`3MonthAbsoluteReturns` decimal(15,5) NOT NULL,
`6MonthDate` date NOT NULL,
`6MonthAbsoluteReturns` decimal(15,5) NOT NULL,
`1YearDate` date NOT NULL,
`1YearAbsoluteReturns` decimal(15,5) NOT NULL,
`3YearDate` date NOT NULL,
`3YearAbsoluteReturns` decimal(15,5) NOT NULL,
`5YearDate` date NOT NULL,
`5YearAbsoluteReturns` decimal(15,5) NOT NULL
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
查询输出
+------------+------------+---------------+-----------------+
| SchemeCode | Date | NetAssetValue | AbsoluteReturns |
+------------+------------+---------------+-----------------+
| 120503 | 2021-04-13 | 65.59480 | 0.00 |
+------------+------------+---------------+-----------------+
| 120503 | 2021-04-12 | 65.22200 | 0.57 |
+------------+------------+---------------+-----------------+
| 120503 | 2021-04-06 | 66.39850 | -1.21 |
+------------+------------+---------------+-----------------+
| 120503 | 2021-03-26 | 65.79040 | -0.30 |
+------------+------------+---------------+-----------------+
| 120503 | 2021-03-12 | 68.38530 | -4.08 |
+------------+------------+---------------+-----------------+
| 120503 | 2021-01-13 | 66.05340 | -0.69 |
+------------+------------+---------------+-----------------+
| 120503 | 2021-01-01 | 64.98200 | 0.94 |
+------------+------------+---------------+-----------------+
| 120503 | 2020-10-13 | 51.78950 | 26.66 |
+------------+------------+---------------+-----------------+
| 120503 | 2020-04-13 | 42.89580 | 52.92 |
+------------+------------+---------------+-----------------+
| 120503 | 2018-04-13 | 45.18520 | 45.17 |
+------------+------------+---------------+-----------------+
| 120503 | 2016-04-13 | 30.94700 | 111.96 |
+------------+------------+---------------+-----------------+
| 120503 | 2013-01-02 | 15.02530 | 336.56 |
+------------+------------+---------------+-----------------+
【问题讨论】:
-
您使用的是哪个 MySQL 版本,您是希望仅存储带有此查询的一个模式代码的结果还是直接存储所有的结果?
-
MySQL 版本 10.3.27。每当在 MF_NAV 中插入新的 NAV 时,我想触发并存储单个方案代码的结果。几乎每个方案代码每晚都会在 MF_NAVs 中插入一条新记录。
-
所以,它是 MariaDB 而不是 MySQL。您是要插入(第一次)然后更新结果表中的 ROW 还是每次都添加?
-
1.正确的 MariaDB。 2.更新行结果表。
-
@BerndBuffen 在数据库中是否可行?感谢您的帮助,感谢您的宝贵时间。