2012-03-04 74 views
1

我试图生成一个数据集,我认为递归是必需的,但我无法完全适应我发现我的目的的众多例子。我想要的最终结果是相当简单的描述。SQL Server递归cte帮助要

涉及两张表:第一张带有相关字段TradeDate,SymbolClse(收盘价)的股票的交易定价,以及一个包含交易日的表格。我想按日期排序定价数据,但如果定价表中缺少交易日期,我希望分区/行编号中断,因为这些数据来自Web服务,它是有时候有点不可预测。

我第一次尝试是有一个WHERE条款,被称为UDF我写的,看是否有该符号/日期组合连续数据再简单不过的选择查询。它工作(运行)和我跑它的夜晚,7个小时后它几乎通过以'A'开始的符号。

编辑
这个帖子矿和响应一小会儿就做回SQL server select query help for stored procedure needed是有帮助的概念,但我目前使用的概念都需要多一点(表时,分区/行编号等)

如果它有助于理解问题,我想使用返回的数据计算每个符号的各种聚合,使用过去数据点的交易日期组合。例如:标志/交易日期的收盘价的5个周期移动平均线将是交易日期为< =计算日期的五个收盘价(期货)的平均值。因此,使用下面第一个表格中的样本数据,我想返回9.02代表符号'A',3个期间,交易日期1/3/12。如果某个计算中缺少数据,我希望为null。

这个结果集我想要的是一个简单的PARTITION选择查询,如果它不是为了检查缺失的日期。因此,这里是所涉及的表的一些样本数据和我的目标结果集:

tblDailyPricingAndVol

TradeDate Symbol Clse 
1/1/12 A  9.01 
1/2/12 A  9.05 
1/3/12 A  8.99 
1/5/12 A  9.03 
1/1/12 B  10.05 
1/4/12 B  10.11 
1/5/12 B  10.03 

tblTradingDays

TradingDate 
1/1/12 
1/2/12 
1/3/12 
1/4/12 
1/5/12 

目标的结果集:

RowNumber TradeDate Symbol Clse 
1   1/1/12 A  9.01 
2   1/2/12 A  9.05 
3   1/3/12 A  8.99 
1   1/5/12 A  9.03 
1   1/1/12 B  10.05 
1   1/4/12 B  10.11 
2   1/5/12 B  10.03 

希望有道理。任何帮助,将不胜感激。我想我会更清楚地看到递归cte,如果我可以按照预期在我自己的数据上运行递归cte。谢谢。

+1

我不认为递归CTE将有助于在这里。你需要的是'滞后'窗口函数。但SQL Server尚不支持。 – 2012-03-04 13:46:53

+0

@a_horse_with_no_name真的吗?也许我对递归cte有很好的把握,因为我没有看到它在这个应用程序中的工作方式。我没有听说过滞后。也许我需要一个游标和一个更程序代码类型的存储过程。 – StatsViaCsh 2012-03-04 14:30:16

+0

'lag'是一个标准的窗口函数,可让您访问以前行的列值。 – 2012-03-04 14:35:15

回答

2

我想结合dense_rank()row_number()将在这里工作:

; with cte as (
    select d.TradingDate,p.Symbol,p.Clse 
    , r=DENSE_RANK()over(order by d.TradingDate) 
    , r1=row_number()over(partition by p.Symbol order by p.TradeDate) 
    from tblTradingDays d 
    inner join tblDailyPricingAndVol p on d.TradingDate=p.TradeDate 
) 
select 
RowNumber=row_number()over(partition by Symbol, (r-r1) order by TradingDate) 
, TradingDate,Symbol,Clse 
from cte 
go 

结果:

enter image description here

+0

这样做。我正要考虑将数据拉入C#并处理那里的逻辑。太棒了!谢谢。 – StatsViaCsh 2012-03-04 15:36:32

+0

欢迎您:) – 2012-03-04 15:41:36

1
set dateformat mdy 

declare @tblDailyPricingAndVol table 
(
    TradeDate date, 
    Symbol char(1), 
    Clse money 
) 

insert into @tblDailyPricingAndVol values 
('1/1/12', 'A',  9.01), 
('1/2/12', 'A',  9.05), 
('1/3/12', 'A',  8.99), 
('1/5/12', 'A',  9.03), 
('1/1/12', 'B',  10.05), 
('1/4/12', 'B',  10.11), 
('1/5/12', 'B',  10.03) 

;with C as 
(
    select TradeDate, 
     Symbol, 
     Clse, 
     row_number() over(partition by Symbol order by TradeDate) as rn 
    from @tblDailyPricingAndVol 
) 
select row_number() over(partition by Symbol, datediff(day, 0, TradeDate) - rn 
         order by TradeDate) as RowNumber, 
     TradeDate, 
     Symbol, 
     Clse 
from C 
order by Symbol, TradeDate 
+0

感谢您的支持,我将尝试两种解决方案。 – StatsViaCsh 2012-03-04 15:53:27