Соединение SQL с использованием условия TOP в подзапросе - PullRequest
0 голосов
/ 25 марта 2012

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

У меня есть две таблицы, с которыми я работаю:

**stocks**
---------
id
name
symbol
ipo_year
sector
industry

**stock_trends**
----------------
stock_id
trend_id
direction_id
date
price
breakout_price

**trends**
----------
id
type

Запись в таблицу stock_trends для этой акции выполняется при выполнении условия одного из четырех моих трендов.

Я хочу создать запрос, который будет возвращать всю информацию из таблицы запасов и дату из таблицы stock_trends, где самая последняя запись в stock_trends для этой акции - это trend_id, который мне интересен. в.

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

SELECT top 1 stock_id, trend_id, [timestamp], price, breakout_price from stock_trends
WHERE stock_id = @stock_id and trend_id = @trend_id order by [timestamp] desc

Я просто не смог понять, как написать запрос, который возвращает акции, чья верхняя запись в таблице stock_trends - это тренд, который я хочу проанализировать.

Заранее спасибо за помощь!

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

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

select s.*, v.latest_trend_date from stocks s
join(select stock_id, MAX(timestamp) as latest_trend_date from stock_trends st
group by st.stock_id) v on v.stock_id = s.id

Теперь, если бы я только мог найти способ определить, с каким трендом_id "latest_trend_date" связан, я был бы готов!

Ответы [ 3 ]

2 голосов
/ 25 марта 2012
select stock_id
from stock_trends
where trend_id = (select top 1 trend_id
                  from stock_trends
                  order by [timestamp] desc)

Это выберет все stock_id, которые находятся в таблице stock_trends, с тем же самым трендом_id, что и самая последняя запись в таблице stock_trends.

1 голос
/ 26 марта 2012

Посмотрите, работает ли что-то подобное:

with TrendsRanked as (
  select
    *,
    rank() over (
      partition by stock_id
      order by [date] desc
    ) as daterank_by_stock
  from stock_trends
)
  select
    s.id, s.name, s.symbol,
    TrendsRanked.[date]
  from stocks as S
  join TrendsRanked as T
  on T.stock_id = S.id
  where T.daterank_by_stock = 1
  and T.trend_id = @my_trend

Идея состоит в том, чтобы добавить ранжирование даты в таблицу stock_trends: для заданной акции daterank_by_stock будет равно 1 для самой последней строки stock_trends (включаясвязей) для этой акции.

Тогда в основном запросе будут только результаты, которые соответствуют тренду, которому вы следуете (@my_trend) для строки в stock_trends с рейтингом # 1.

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

0 голосов
/ 25 марта 2012

Я предполагаю, что [timestamp] в вашем исходном запросе - это "date" из вашей табличной модели.

    select s.*, st1.trend_id, st1.timestamp
    from stocks as s
    inner join (
    select top 1 stock_id, trend_id, [timestamp] as timestamp
        from stock_trends
        where stock_id = @stock_id and trend_id = @trend_id
        order by [timestamp] desc
        ) as st1
        on s.id = st1.stock_id

Размещение подзапроса в виде объединенного встроенного представления позволит вам легко поместить дату в результаты, как вы ожидали сделать в своей спецификации.

"... вернуть всю информацию из таблицы запасов и дату из таблицы stock_trends ..."

...