php – 完成:对于Z公司,计算A超过X天的平均值.我现在如何:对于平均A最高的公司,返回第X天的B值?

前端之家收集整理的这篇文章主要介绍了php – 完成:对于Z公司,计算A超过X天的平均值.我现在如何:对于平均A最高的公司,返回第X天的B值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
(我将首先解释我的问题.下表(任何示例查询)可在 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)
>以平均看涨率最高的公司的第3天回报并存储它
>最后,通过将存储的returnpcts相加来计算总回报

在这个例子中有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,第3天返回-0.12.对于其他2个“日期范围”,获胜者是公司4(平均公牛力为2.14,回报率为0.50)和公司2公司(公牛力量为1.67,回报率为1.10)
>应存储值-0.12,0.50,1.10
>总返回值将是-0.12 0.50 1.10 = 1.48,应该从查询(或脚本)返回

问题1:假设上面的例子,我的查询返回第1天returnpct(1.27)而不是第3天returnpct(-0.12).我怎么能改变这个?

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

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

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

以下查询对您要执行的操作有很大帮助.它计算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变得单调乏味.在支持分析/窗口函数和“with”语句的数据库中,这将更容易(除了MysqL之外几乎所有数据库:例如,Oracle,Postgres,DB2,sql Server).

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

顺便说一句,谢谢你设置一个sql小提琴.仅仅因为理由,我会提出这个问题.

原文链接:https://www.f2er.com/php/136580.html

猜你在找的PHP相关文章