我正在写一个股票计划来提高我的编程技巧,我遇到了障碍。
我有两张桌子正在与我合作:
**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”与之相关,那么我将全部设定!
答案 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表中返回库存表中的所有信息和日期......”