我正在努力解决在存储过程中构造 sql select 查询所需的逻辑。我的数据库使用股票市场数据。我有一个 2012 年交易日期表、一个股票代码表以及一个通过网络服务列出这些代码和交易日期的每日定价数据表。我正在尝试从我正在处理的选择查询中获取用组件编写的 Web 服务地址字符串。
下面的第一个过程足以返回具有“符号、开始日期、结束日期”字段的记录,其中开始日期和结束日期代表每个符号所需的最早和最新的缺失数据点:
ALTER PROCEDURE dbo.sprocSymbsDatesForHistoricalPricingVoll
AS
DECLARE @NxtAvailableDataDownloadDate date
SET @NxtAvailableDataDownloadDate = dbo.NextAvailableDataDownloadDate()
SELECT Symbol, MIN(TradingDate), Max(TradingDate)
FROM (SELECT Symbol, TradingDate
FROM (SELECT tblSymbolsMain.Symbol, tblTradingDays.TradingDate
FROM tblSymbolsMain CROSS JOIN
tblTradingDays
WHERE (tblTradingDays.TradingDate <= @NxtAvailableDataDownloadDate)) AS T1
WHERE (NOT EXISTS
(SELECT TradeDate, Symbol
FROM tblDailyPricingAndVol
WHERE (TradeDate = T1.TradingDate) AND (Symbol = T1.Symbol)))) t GROUP BY Symbol ORDER BY Symbol
这可以很好地将所有股票代码与所有交易日期交叉连接,并返回不在我的定价表中的代码。美好的。我的问题是,虽然我可能会返回一行,该行给出了我需要的每个符号从该表中的最小和最大日期:
AAPL, 1/1/12, 1/10/12
我的定价表中可能已经有该日期范围内的一些所需数据点,例如:
AAPL, 1/5/12- 1/9/12
在这种情况下我想得到的是:
AAPL, 1/1/12, 1/4/12
AAPL, 1/10/12, 1/10/12
而不是上面带有股票代码的第一个示例。我可以通过以程序代码方式循环来轻松完成此操作,但我希望看到它在数据库端实现。有任何想法吗?提前致谢...