在子查询中使用TOP条件的SQL连接

时间:2012-03-25 15:50:37

标签: sql sql-server join subquery

我正在写一个股票计划来提高我的编程技巧,我遇到了障碍。

我有两张桌子正在与我合作:

**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表中的所有信息以及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

现在,如果我只能找到一种方法来确定哪个trend_id“latest_trend_date”与之相关,那么我将全部设定!

3 个答案:

答案 0 :(得分:2)

select stock_id
from stock_trends
where trend_id = (select top 1 trend_id
                  from stock_trends
                  order by [timestamp] desc)

这将选择stock_trends表中的所有stock_id,并使用与stock_trends表中最新条目相同的trend_id。

答案 1 :(得分:1)

看看这样的事情是否有效:

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将等于该股票的最新stock_trends行(包括关系)。

然后在主查询中,唯一的结果将是那些与您正在关注的趋势(@my_trend)匹配的stock_trends排名为#的行。

这给出了我认为你想要的 - 股票的股票信息,其最新的stock_trends条目恰好是你所关注的趋势的条目。

答案 2 :(得分:0)

我假设原始查询中的[时间戳]是表格模型中的“日期”。

    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表中返回库存表中的所有信息和日期......”