SQL Server 选择所需存储过程的查询帮助

2024-06-21

我正在努力解决在存储过程中构造 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

而不是上面带有股票代码的第一个示例。我可以通过以程序代码方式循环来轻松完成此操作,但我希望看到它在数据库端实现。有任何想法吗?提前致谢...


递归就是你的答案。以下是如何获取内部 select 语句并将其转换为范围行。递归在 SQL 2005 或更高版本中可用,因此我希望这对您有用。

create table dates (dt datetime  null)
go
insert into dates(dt) values('1/1/2012')
insert into dates(dt) values('1/2/2012')
insert into dates(dt) values('1/3/2012')
insert into dates(dt) values('1/4/2012')
insert into dates(dt) values('1/10/2012')
go

--Show raw data
select * from dates
go

--Define the recursive query
WITH RecursiveQuery (anchorDate, dt)
AS
(
    -- Anchor member of recursive query
    SELECT 
        anchorDate=dt,
        dt
    FROM 
        dates AS e
    WHERE 
        NOT EXISTS(select 1 from dates where dateadd(day,-1,e.dt)=dt)
    UNION ALL
    -- Recursive member (notice join to RecursiveQuery)
    SELECT 
        anchorDate=d.anchorDate,
        e.dt
    FROM 
        dates AS e
        INNER JOIN RecursiveQuery AS d ON e.dt = dateadd(day,1,d.dt)
)

--Final Join
select 
    startdt=anchorDate,enddt=max(dt) 
FROM 
    RecursiveQuery 
group by anchorDate
order by anchorDate
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 选择所需存储过程的查询帮助 的相关文章

随机推荐