2015-12-12 4 views
3

У меня много трудностей, пытаясь реализовать этот конкретный запрос как относительный слабый новичок с mysql и синтаксисом.Как объединить эти два запроса в 1, чтобы соответствовать условию?

У меня есть 3 таблицы

  • SYMBOLS_LIST (содержит список символов акций) (ключ = СИМВОЛ)
  • T50DMA (содержит 50-дневной скользящей средней, уже вычисленного для каждого символа каждый день) (содержит ДАТА, FIFTY_DAY_MA столбцы)
  • T200DMA (содержит 200 дневная скользящая средняя уже рассчитывается для каждого символа каждый день) (содержит DATE, TWO_HUNDRED_DAY_MA столбцы)

Я пытаюсь определить список символов, в которых цена 50DMA имеет кроссовер 200DMA для сегодняшней даты. Скользящие средние уже были рассчитаны и сохранены в соответствующей таблице, поэтому расчет скользящего среднего не требуется.

Для обнаружения кроссовера, я пытаюсь выполнить следующие действия, чтобы получить список символов, где:

Today's 50DMA t1 > Today's 200DMA t2 
    AND 
Yesterday's 50DMA t1 <= Yesterday's 200DMA t2 

Самое большее, что я был в состоянии писать состоит из двух отдельных запросов, которые дают мне список первого и второго, но я не уверен, как их сочетать, чтобы выполнить условие, написанное выше.

Как это можно записать для удовлетворения обоих условий в 1 заявлении? Большое вам спасибо за любую помощь, которую вы можете предложить.

Дополнительная Edit:

Вот два запроса, которые я смог построить:

**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:

Предполагая, что условие 1 для сегодняшних 50 DMA> сегодняшних 200 DMA (И) 50 DMA < = 200 DMA Вчерашнее, я бы ожидал увидеть только список Вчерашний символы (или с сегодняшним днем), указывающих, что кроссовер произошел, такие как:

'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) и по сравнению с предыдущим торговым днем ​​(2015-12-11) по проверка данные в 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.

Есть ли способ реализовать в том же запросе, или это сделает его слишком сложным для обработки? Спасибо!!

+0

Значит, вы хотите, чтобы символы отображались в обоих вариантах? Дайте некоторые примеры данных и то, что вы ожидаете от результата, чтобы проиллюстрировать ваш вопрос. – Dijkgraaf

+0

Hi Dijkgraff, я предоставил ответ с дополнительной информацией. спасибо, что посмотрели. – livefire

+0

Спасибо Dijkgraaf !! Я подтвержу это против результатов закрытия дня и дам вам знать результат! Я запустил это в предыдущие дни, когда создаваемые вами запросы работали над предоставлением списка символов. Основываясь на приведенных выше примерах для 2015-12-14, я видел их в списке. Я приведу подтверждение позже этим вечером, когда я получу новые данные и смогу сравнить их с другим источником.Конечно, я был совершенно не в своем первоначальном запросе и не смог бы решить это без вашей щедрости и опыта! Спасибо, сэр! Будем писать позже. – livefire

ответ

1

Когда вы говорите И в SQL это означает, он должен соответствовать обоим условиям. У вас есть и t1.DATE='2015-12-10', и t1.DATE='2015-12-09', так как это не может быть правдой в то же время, когда вы не получите никаких результатов.

Несмотря на то, что данные поступают из одной таблицы, вам нужно рассматривать их как отдельные таблицы, используя псевдоним.

Однако, первый для удобства чтения SQL, позволяет переформатировать SQL с использованием соединения, а не комплекс ИНЕКЕ, а также дает второй запрос различные псевдонимы

**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 

Надеюсь, я не потеряются какие-либо из ваших запросов. Попробуйте, чтобы увидеть, получаете ли вы то, что ожидаете.

P.S. Заметьте, почему вы группируете 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 
Смежные вопросы