8

(我将首先解释我的问题。下表(任何示例查询)可在 http://sqlfiddle.com/#!2/8ec17/4上找到)

我有一张包含股票信息的表格,如下所示:

sp100_id  _date         bullishness  returnpct
----------------------------------------------
1         2011-03-16    1.01         -0.33
1         2011-03-17    0.85         -1.28
1         2011-03-18    0.89          1.25
1         2011-03-21    1.46          1.21
1         2011-03-22    0.39         -2.53
2         2011-03-16    3.07          1.27
2         2011-03-17    2.09         -0.80
2         2011-03-18    0.91         -0.12
2         2011-03-21    1.50          0.00
2         2011-03-22    2.62          1.10
3         2011-03-16    0.73         -1.13
3         2011-03-17    1.13          1.21
3         2011-03-18    1.12          0.45
3         2011-03-21    1.00          1.01
3         2011-03-22    1.00         -0.53
4         2011-03-16    0.40          1.10
4         2011-03-17    2.40          0.03
4         2011-03-18    3.16         -0.10
4         2011-03-21    0.86          0.50
4         2011-03-22    1.00          0.10

我需要的是:

  • 每连续 3 天,计算每家公司的平均看涨程度 ( sp100_id)
  • returnpct取平均看涨度最高的公司的第 3 天并存储
  • returnpct最后,通过将存储returnpct的 s相加来计算总数

在这个例子中有 5 _dates,所以有连续的天数对:

  • 2011-03-16, 2011-03-17,2011-03-18
  • 2011-03-17, 2011-03-18, 2011-03-21(请注意,2011-03-19 不在表中)
  • 2011-03-18, 2011-03-21,2011-03-22

回到我需要的东西:

  • 在前三天,“赢家”是公司 2,平均牛市为 (3.07 + 2.09 + 0.91) / 3 = 2.0233,第三天的回报率为 -0.12。对于其他 2 个“日期范围”,获胜者是公司 4(平均牛市 2.14 和回报率 0.50)和公司 2(牛市 1.67,回报率 1.10)
  • 应存储值 -0.12、0.50、1.10
  • 总 returnpct 将是 -0.12 + 0.50 + 1.10 = 1.48,应该从查询(或脚本)返回

问题 1:关于上面的例子,我的查询返回第 1 天returnpct(1.27) 而不是第 3 天returnpct(-0.12)。我怎样才能改变这个?

问题2:在sqlfiddle中,我连续3天硬编码了第一组。我怎样才能自动化这个(也许使用 php),这样我就不必手动输入所有查询?请注意表格中缺少日期。与示例中一样,脚本应该只取表中的下一个可用日期(所以 after 2011-03-18come 2011-03-21,而不是2011-03-19因为它不在表中)

问题 3:在示例中,我使用了连续 3 天,但理想情况下,可以轻松更改脚本以使用任何其他连续天数(例如 2、4 或 8 天)。因此,应分别存储第 2 天、第 4 天或第 8 天的返回值。

谁能帮我解决我在这里遇到的一些问题?任何帮助是极大的赞赏 :-)

4

1 回答 1

3

以下查询对您想要做的事情大有帮助。它计算 3 天的平均值,然后在每个日期内按最高平均值排序:

SELECT s.sp100_id, s._date,
       (s.bullishness+splus1.bullishness+splus2.bullishness)/3 as avgb,
       splus2.returnpct
FROM (select s3.*,
             (select min(_date)
                    from stocks s4
                    where s4.sp100_id  = s3.sp100_id and
                          s4._date > s3.dateplus1
                   ) as dateplus2
      from (select s.*,
                   (select min(_date)
                    from stocks s2
                    where s2.sp100_id  = s.sp100_id and
                          s2._date > s._date
                   ) as dateplus1
            from stocks s
           ) s3
     ) s left outer join
     stocks splus1
     on s.sp100_id = splus1.sp100_id and
        s.dateplus1 = splus1._date left outer join
     stocks splus2
     on s.sp100_id = splus2.sp100_id and
         s.dateplus2 = splus2._date
order by 2, 3 desc

在这一点上,使用 mysql 变得乏味。这在支持分析/windows 函数和“with”语句的数据库中会容易得多(例如,除了 mysql 之外的每个数据库:Oracle、Postgres、DB2、SQL Server)。

您可以在 MySQL 中使用单个查询执行 (3),但这很痛苦。您可能希望在应用程序层中执行此操作。

顺便说一句,感谢您设置 SQL Fiddle。仅出于原因,我会赞成这个问题。

于 2012-08-18T14:54:52.743 回答