我使用以下查询来获取日期之间存在的所有值(作为参数传递):
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/