我现在几天都无法解决这个问题,我希望你能提供帮助。
我正在尝试编写一个查询,该查询返回有关库存和上次更新的所有信息。我想根据参数@date过滤结果,只返回它最近更新的股票小于提供的@date参数。我还需要时间戳为null的股票,所以我知道这些股票需要更新。我正在使用以下三个表格:
stocks
- id
- asset_id
- market_id
- name
- symbol
- IPOYear
- sector
- industry
updates
- id
- [timestamp]
stock_updates
- stock_id
- update_id
我一直在使用以下查询,它对我来说效果很好,直到我意识到如果股票没有更新它不会起作用
select * from stocks s
where @date < (
select top 1 u.timestamp from
updates u,
stock_updates su
where
s.id = su.stock_id and
u.id = su.update_id
order by u.timestamp desc
)
所以经过一些研究后,我遇到了外连接,我认为这是我需要解决我的问题,我只是无法构建正确的查询。我最接近的是以下内容,但它会在每次更新股票时返回一条记录。在此先感谢您的帮助!
这就是我现在所处的位置:
select * from stocks s
left outer join stock_updates su on s.id = su.stock_id
left outer join updates u on u.id = su.update_id
where u.[timestamp] < @date
答案 0 :(得分:3)
select s.*, u.timestamp
from stocks s
left join
(select su.stock_id, MAX(u.timestamp) timestamp
from updates u
inner join stock_updates su
on u.id = su.update_id
group by su.stock_id
) as u
on s.id = u.stock_id
where u.[timestamp] is null or u.[timestamp] < @date
答案 1 :(得分:2)
或许这样的事情?
SELECT s.*, v.timestamp
FROM stocks s
LEFT JOIN (
SELECT MAX(u.timestamp) AS timestamp, su.stock_id
FROM stock_updates su
INNER JOIN updates u ON (u.id = su.update_id)
GROUP BY su.stock_id
) v ON (v.stock_id = s.stock_id)
基本上它只是将stocks
表加入“内联视图”,这是查询的结果,用于确定每个timestamp
的最大stock_id
。
答案 2 :(得分:1)
我没有在@date
参数中包含任何过滤,因为您的问题是
“我正在尝试编写一个返回有关a的所有信息的查询 库存和最后一次更新“
为此您不需要任何过滤。
此查询正是如此:
select s.*, dr.maxtime,
from stocks s
left join (select MAX(u.timestamp) as maxtime, su.stock_id
from stock_updates su inner join updates u on u.id = su.update_id
group by su.stock_id) dr
on dr.stock_id = s.stock_id
where
maxtime < @date or maxtime is null
[BTW:left join
与left outer join
]
答案 3 :(得分:0)
试试这个
select s.*, max(su.timestamp)
from
stocks s
left outer join
stock_update su
on (s.id = su.stock_id)
left outer join
updates u
on (u.id = su.update_id)
group by s.*
这是我的头脑。你对@date
有什么看法?这是否意味着“现在”?您的意思是最新的时间戳,还是@date
之前的最新时间戳?