我使用以下查询来获取日期之间存在的所有值(作为参数传递):

SELECT date, share_id, close, sma50, sma100, sma200 FROM this, that, other
WHERE this.id = that.share_id
AND that.id = other.id
AND date <= '2014-08-13'
AND date >= '2014-07-31'
AND share_id IN (2625, 2626, 2628)
ORDER BY share_id, date;


哪个返回数据:

date        share_id close      sma50       sma100      sma200
2014-07-31  2625    61963.00    62114.7200  60182.0200  55867.6050
2014-08-01  2625    61292.00    62150.6600  60248.8700  55931.0700
2014-08-04  2625    62108.00    62190.4600  60315.9900  55999.2950
2014-08-05  2625    61191.00    62218.3200  60370.9000  56064.2500
2014-08-06  2625    60233.00    62241.6000  60408.7700  56121.0900
2014-08-07  2625    59765.00    62243.2400  60432.4000  56173.6650
2014-08-08  2625    60522.00    62260.6800  60461.6200  56230.3400
2014-08-11  2625    61492.00    62300.0000  60511.3300  56286.7950
2014-08-12  2625    61450.00    62322.9000  60560.8300  56343.2450
2014-08-13  2625    61172.00    62318.4200  60594.6100  56398.4750
2014-07-31  2626    24606.00    24751.3800  24431.3722  24137.0023
2014-08-01  2626    24258.00    24752.0400  24427.6622  24142.5973
2014-08-04  2626    24353.00    24753.8400  24426.0459  24148.3023
2014-08-05  2626    24100.00    24757.0800  24425.9971  24155.1223


在技​​术分析中,移动平均线的交叉是可能趋势变化的信号。
在以下情况下是否可以隔离:

在此日期范围内,sma50是从大于sma200变为小于sma200?是否可以在单个查询中执行...查找该时段内每个特定份额sma50越过sma200的所有份额?

我想不出一种优雅的方法来执行此操作,而无需在存储过程中迭代/循环遍历日期。

预期结果集(如果我们检查sma200以下的收盘价交叉,则更改上面最后一条记录的收盘价):

2014-08-05  2626    24100.00    24757.0800  24425.9971  24155.1223


仅举一个简单的例子,使其更清楚:

date        sma200      sma50
2014-08-05  4080.4500   4022.2200
2014-08-06  4079.8700   4030.4600
2014-08-07  4079.4800   4039.7400
2014-08-08  4078.9050   4051.8400
2014-08-11  4079.3600   4066.3000
--->2014-08-12  4079.9750   4081.6600
    2014-08-13  4079.7500   4093.4200
    2014-08-14  4079.7000   4106.0000
    2014-08-15  4079.4950   4117.7200
    2014-08-18  4078.3300   4130.2400
    2014-08-19  4077.1250   4141.8400
    2014-08-20  4076.6350   4152.6600
    2014-08-21  4075.6400   4162.8000
    2014-08-22  4073.5950   4174.6400


使用的查询:

SELECT date, sma200, sma50
FROM this, dly, ndctrs
WHERE this.id = that.share_id
AND that.id = other.id
AND date >= '2014-06-05'
AND date <= '2014-08-22'
AND share_id = 4500;


预期结果:

date        sma200      sma50        type
2014-08-12  4079.9750   4081.6600    over


可能的解决方案:

查找在此期间sma50> = sma200的所有位置
查找在此期间sma50
如果两个数据集中返回的结果都超过1,则可以说发生了交叉,发现何时何地更困难

最佳答案

 Select date, share_id, close, sma50, sma100, sma200 From (
    SELECT date, share_id, close, sma50, sma100, sma200 FROM this, that, other
    WHERE this.id = that.share_id
    AND that.id = other.id
    AND date <= '2014-08-13'
    AND date >= '2014-07-31'
    AND share_id IN (2625, 2626, 2628)
    ORDER BY share_id, date) as expr1
Where sma50 < sma200 group by share_id


我将查询集复制到一个表中以对其进行测试-您可能必须使用其嵌套方式来调整一些较小的语法错误,但是原理是可行的。这将选择sma50大于sma200的所有记录,但是Group By会将其折叠以仅获取每个share_id的第一条记录。由于您已经按日期对结果集进行了排序,因此它将选择的记录是每个share_id的最早记录。

关于mysql - 查找何时值在Mysql中交叉?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25316827/

10-12 20:40