作为一个使用mysql和语法的相对温和的初学者,我很难实现这个特定的查询。
我有三张桌子
我试图确定一个符号列表,其中50 for价格与今天日期的200 for价格交叉。移动平均值已经计算并存储在相应的表中,因此不需要移动平均计算。
为了检测交叉,我尝试实现以下步骤来获得符号列表:
Today's 50DMA t1 > Today's 200DMA t2
AND
Yesterday's 50DMA t1 <= Yesterday's 200DMA t2
我能写的最多的是两个单独的查询,给出了第一个和第二个查询的列表,但我不知道如何将它们结合起来以满足上面写的条件。
如何在1条语句中编写这两种条件?非常感谢您能提供的任何帮助。
补充编辑:
下面是我能够构造的两个查询:
**Today's 50DMA t1 > Today's 200DMA t2**
select t1.SYMBOL from T50DMA t1, T200DMA t2 where
t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST) AND
t1.SYMBOL=t2.SYMBOL AND
(t1.DATE='2015-12-10' AND t2.DATE='2015-12-10' AND
t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE) GROUP BY
t1.SYMBOL, t1.DATE;
**Yesterday's 50DMA t1 <= Yesterday's 200DMA t2**
select t1.SYMBOL from T50DMA t1, T200DMA t2 where
t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST) AND
t1.SYMBOL=t2.SYMBOL AND
(t1.DATE='2015-12-10' - INTERVAL 1 DAY AND t2.DATE='2015-12-10' - INTERVAL 1
DAY AND
t1.FIFTY_DAY_MOVING_AVERAGE <= t2.TWO_HUNDRED_DAY_MOVING_AVERAGE) GROUP BY
t1.SYMBOL, t1.DATE;
我只是不知道如何组合这些条件,使这两个条件在1语句中有效,只有那些符合条件的符号才能返回。谢谢你在这方面的帮助。
12/14/2015编辑:我尝试了这个查询,但它根本没有返回任何结果。如果我注释掉任何一行并运行它,我就会得到一个查询或另一个查询的结果,但当这两个查询都被定义时,不会得到任何结果。查询有什么问题?我被卡住了。
select t1.SYMBOL
from T50DMA t1, T200DMA t2
where t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND ((t1.SYMBOL=t2.SYMBOL) AND (t1.DATE='2015-12-10' AND t2.DATE='2015-12-10') AND (t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE))
AND ((t1.SYMBOL=t2.SYMBOL) AND (t1.DATE='2015-12-09' AND t2.DATE='2015-12-09') AND (t1.FIFTY_DAY_MOVING_AVERAGE <= t2.TWO_HUNDRED_DAY_MOVING_AVERAGE));
对Dijkgraaf的响应:
假设今天的50 DMA >今天的200 DMA (和)昨天的50 DMA <=昨天的200 DMA的条件1,我希望只看到一个符号列表(或有今天的日期),表示交叉发生了,例如:
'2015-12-14 00:00:00', 'AAON'
'2015-12-14 00:00:00', 'ADGE'
'2015-12-14 00:00:00', 'BLK'
'2015-12-14 00:00:00', 'CRY'
我提取了昨天(2015-12-14)的数据,并通过在Excel中执行
AND(IF(today's 50DMA>Today's 200 DMA,1,0),IF(Yesterday's 50 DMA<=Yesterday's 200DMA,1,0)) 1=True, 0=False
Here are a few entries of data:
TODAY'S DATE SYMBOL 50DMA 200DMA YESTERDAY DATE SYMBOL 50DMA 200DMA RESULT
12/14/2015 0:00 ADGE 0.4991 0.498 12/11/2015 0:00 ADGE 0.4958 0.4979 TRUE
12/14/2015 0:00 CRY 10.432 10.429 12/11/2015 0:00 CRY 10.426 10.429 TRUE
For ADGE, it would be:
(0.4991 > 0.498) AND (0.4958 <= 0.4979) = true 50 DMA crossed over 200 DMA
For CRY, it would be:
(10.432 > 10.429) AND (10.426 <= 10.429) = true 50 DMA crossed over 200 DMA
由于某些原因,我不明白为什么查询不会返回任何符号。我可能没有正确地实现它,或者我在某种程度上混淆了它?
select t1.SYMBOL
from T50DMA t1, T200DMA t2
where t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND ((t1.SYMBOL=t2.SYMBOL) AND (t1.DATE='2015-12-14' AND t2.DATE='2015-12-14') AND (t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE))
AND ((t1.SYMBOL=t2.SYMBOL) AND (t1.DATE='2015-12-11' AND t2.DATE='2015-12-11') AND (t1.FIFTY_DAY_MOVING_AVERAGE <= t2.TWO_HUNDRED_DAY_MOVING_AVERAGE));
补充问题(2015-03-17):
在一个附带的问题上,是否有一种方法(通过案例或如果声明)确定,如果间隔-1天是在星期日或星期六,让它选择前星期五?在某些情况下,即使是在一个星期五(如耶稣受难日),市场将关闭,在那里不会产生任何数据。在一个名为"WEEKLY_LOOKUP“的表中,我有一个每周实际市场日期范围的每周查找表(开始日期和结束日期)。例如,如果在星期五市场关闭,表将指示结束日期将是一个“星期四”,而不是一个星期五。
处理两种情况: 1)如果间隔-1天是星期六或周日,那么下一个工作日是星期五。2)但如果星期五是一个非市场的日子,那么就需要把它定在前一个星期四。表中有引用WEEKLY_LOOKUP (结束日期)的方法吗?例如,2015年星期五-03-25市场已经关闭.
WEEKLY_LOOKUP
START_DATE END_DATE
'2016-03-21 00:00:00', '2016-03-24 00:00:00'
例如,这将产生一个2016-03-28日和一个与2016-03-24相比的前一天。
是否有一种将其实现到同一个查询中的方法,或者它是否会使查询过于复杂而无法处理?谢谢你!!
发布于 2015-12-14 17:27:16
当您在SQL中说和它意味着,它必须匹配这两个条件。您有t1.DATE='2015-12-10'
和t1.DATE='2015-12-09'
,因为它们不可能同时为真,同时也不会得到任何结果。
即使数据来自同一个表,您也需要使用别名将它们视为单独的表。
但是,首先,为了便于读取SQL,可以使用Joins重新格式化您的SQL,而不是复杂的WHERE子句,并且还可以为第二个查询提供不同的别名。
**Today's 50DMA t1 > Today's 200DMA t2**
select t1.SYMBOL
from T50DMA t1
INNER JOIN T200DMA t2 ON t2.SYMBOL=t1.SYMBOL
where t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND t1.DATE='2015-12-10' AND t2.DATE='2015-12-10'
AND t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE
GROUP BY t1.SYMBOL, t1.DATE;
**Yesterday's 50DMA t1 <= Yesterday's 200DMA t2**
select t3.SYMBOL
from T50DMA t3
INNER JOIN T200DMA t4 ON t4.SYMBOL=t3.SYMBOL
where t3.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND t3.DATE='2015-12-10' - INTERVAL 1 DAY AND t4.DATE='2015-12-10' - INTERVAL 1 DAY
AND t3.FIFTY_DAY_MOVING_AVERAGE <= t4.TWO_HUNDRED_DAY_MOVING_AVERAGE
GROUP BY t3.SYMBOL, t3.DATE;
现在把它们加在一起。
select t1.SYMBOL
from T50DMA t1
INNER JOIN T200DMA t2 ON t2.SYMBOL=t1.SYMBOL
INNER JOIN T50DMA t3 ON t3.SYMBOL=t1.SYMBOL
INNER JOIN T200DMA t4 ON t4.SYMBOL=t3.SYMBOL
where t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND t1.DATE='2015-12-10'
AND t2.DATE='2015-12-10'
AND t3.DATE='2015-12-10' - INTERVAL 1 DAY
AND t4.DATE='2015-12-10' - INTERVAL 1 DAY
AND t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE
AND t3.FIFTY_DAY_MOVING_AVERAGE <= t4.TWO_HUNDRED_DAY_MOVING_AVERAGE
GROUP BY t1.SYMBOL, t1.DATE;
然后再简化一点
select t1.SYMBOL
from T50DMA t1
INNER JOIN T200DMA t2 ON t2.SYMBOL=t1.SYMBOL AND t2.DATE=t1.DATE
INNER JOIN T50DMA t3 ON t3.SYMBOL=t1.SYMBOL AND t3.DATE=t1.DATE - INTERVAL 1 DAY
INNER JOIN T200DMA t4 ON t4.SYMBOL=t1.SYMBOL AND t4.DATE=t3.DATE
where t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND t1.DATE='2015-12-10'
AND t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE
AND t3.FIFTY_DAY_MOVING_AVERAGE <= t4.TWO_HUNDRED_DAY_MOVING_AVERAGE
GROUP BY t1.SYMBOL, t1.DATE
希望我没有回答你的任何疑问。试试看你是否得到了你所期望的。
请注意,您为什么要分组日期,因为您只选择一个日期,但可能您打算这样做,而不是选择一个日期。
select t1.SYMBOL, t1.DATE
from T50DMA t1
INNER JOIN T200DMA t2 ON t2.SYMBOL=t1.SYMBOL AND t2.DATE=t1.DATE
INNER JOIN T50DMA t3 ON t3.SYMBOL=t1.SYMBOL AND t3.DATE=t1.DATE - INTERVAL 1 DAY
INNER JOIN T200DMA t4 ON t4.SYMBOL=t1.SYMBOL AND t4.DATE=t3.DATE
where t1.SYMBOL IN (SELECT SYMBOL from SYMBOLS_LIST)
AND t1.FIFTY_DAY_MOVING_AVERAGE > t2.TWO_HUNDRED_DAY_MOVING_AVERAGE
AND t3.FIFTY_DAY_MOVING_AVERAGE <= t4.TWO_HUNDRED_DAY_MOVING_AVERAGE
GROUP BY t1.SYMBOL, t1.DATE
https://stackoverflow.com/questions/34235471
复制相似问题