Sql = хочу использовать make для внутреннего соединения, но не для таблиц

Я хочу использовать тот факт, что на двух столах t1 а также t2 Я могу сделать внутреннее соединение с on t1.colum1>t2.colum2 рассчитать максимальную просадку вектора возврата. Проблема в том, что внутреннее соединение возможно только с двумя сохраненными базами данных или таблицами, и я хотел сделать это, выбрав только часть таблиц.

Есть ли другая возможность, я совершенно новичок в SQL и не могу найти другой вариант?

Спасибо

редактировать

прежде чем манипулировать своим внутренним объединением, чтобы рассчитать максимальную просадку, я должен иметь возможность выполнить это внутреннее соединение для выбора в таблицах, а не в самих таблицах. Поэтому я последовал совету Марка, но все еще получаю ошибку. Вот мой запрос:

select * 
from (select * from bars where rownum <= 10 as x)as tab1
inner join (select * from bars where rownum <= 10  as y) as tab2
on tab1.x=tab2.y

Ошибка ora-00907 missing right parenthesis

  • дополнительная информация извлечена из сообщения ОП, опубликованного в качестве ответа на этот пост. *

3 ответа

Вы также можете использовать внутреннее объединение для подселектов, вам просто нужно дать псевдонимам подселектов:

SELECT *
FROM (SELECT 1 AS X) AS T1
INNER JOIN (SELECT 1 AS Y) AS T2
ON T1.X = T2.Y

Если вы разместите свой нерабочий запрос, я могу дать вам лучший ответ, более точно соответствующий вашим точным таблицам.

(внутреннее) объединение не ограничивается целыми таблицами.

Я получил определение максимальной просадки с инвестиционного сайта (спасибо Google!). Поэтому я думаю, что нам нужно рассчитать процентное падение между самой высокой точкой на графике и ее последующей самой низкой точкой.

Следующий запрос вычисляет максимальную просадку инвестиций в акции Oracle за последние двенадцать месяцев. Присоединяется к investments таблица сама по себе, с псевдонимами, чтобы различать версии таблицы (один для самого высокого пика, один для самого низкого впадины). Это может не отражать вашу точную бизнес-логику, но показывает методы SQL, которые предлагает вам Oracle.

select round(((max_return-min_return)/max_return)*100, 2) as max_drawdown
from
    ( select max(t1.return_amt) as max_return
             , min(t2.return_amt) as min_return
      from investments t1
           join  investments t2
           on ( t1.stock_id = 'ORCL'
                and   t2.stock_id = t1.stock_id
                and   t2.created_date > t1.created_date )
      where t1.created_date >= add_months(sysdate, -12)
      and t2.created_date >= add_months(sysdate, -12)
    )
/

Этот запрос вернет ноль, если акция не испытала падение в течение окна. Он также не проверяет последующий подъем (насколько я понимаю, просадка должна быть дном корыта, точка, которую мы можем установить только после того, как акция снова начнет подниматься).

Что касается обучения на дому, для этой цели мы можем загрузить программное обеспечение из Oracle TechNet. Если пропускная способность или дисковое пространство являются проблемой, перейдите на Express Edition; он не имеет всех функций, но вы, вероятно, пока не захотите их использовать. Oracle предоставляет бесплатную IDE, SQL Developer. Как следует из названия, он в первую очередь нацелен на разработчиков, но обладает многими DBA-ориентированными возможностями DB Artisan. Для полноценного управления базами данных Oracle предлагает Enterprise Manager.

редактировать

В комментариях Outis предлагает

Вы можете добавить t1.return_amt > t2.return_amt в соединении в качестве незначительной оптимизации

Я думаю, что вряд ли return_amt будет проиндексирован, так что я думаю, что вряд ли такое положение повлияет на производительность. Что бы это сделать, это изменить поведение акций, которые не имеют просадки. Запрос, который я представил, возвращает ноль для акций, которые непрерывно увеличивались во временном окне. Дополнительный фильтр будет возвращать NULL в таком случае. Какой более желательный результат зависит от вкуса (или требований спецификации).

Другие вопросы по тегам