2012-03-04 18 views
1

データセットを生成しようとしていますが、再帰が必要だと思っていますが、目的に合わせて数多くの例を変更することはできません。私が望む最終結果は、説明するのがかなり簡単です。SQL Serverの再帰的なヘルプが必要です

関連するフィールドTradeDate,Symbol、およびClse(終値)を持つ株式の最初の取引価格と、取引日を列挙したテーブルが含まれています。私は日付で注文されたシンボルで価格設定データを分割したいと思いますが、価格データテーブルに取引日付がない場合は、パーティション/行の番号付けを壊してください。このデータは、時には少し予期しない。

私の最初の試みは、そのシンボル/日付の組み合わせの連続データがあるかどうかを調べるために書いたudfを呼び出すWHERE節を持つ単純な十分な選択クエリでした。それはうまくいった(走った)と私はそれを実行した夜、7時間後には、ほぼ "A"で始まるシンボルを通過していた。

EDIT
私のこのポストと応答バックSQL server select query help for stored procedure needed SO上の少しの間には、概念的に便利だったが、コンセプトの私の現在の使用がもう少し必要です(テーブル結合、分割/行などの番号)

問題を理解するのに役立ちましたら、過去のデータポイントを使用する記号、取引日の組み合わせごとにさまざまな集計を計算するために返されたものを使用したいと思います。例:シンボル/取引日の終値の5期間移動平均は、取引日が< =計算されている5つの終値(clse)の平均となります。最初のテーブルの下のサンプルデータを使用して、シンボル「A」の9.02、3つの期間、取引日の1/3/12を返したいとします。データの1つが欠落している場合は、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の方がはるかにはっきりと分かると思います。ありがとう。私はdense_rank()row_number()を組み合わせることここで働くだろうと思い

+1

私は再帰CTEがここに役立つだろうとは思いません。あなたが必要としているのは、 'lag'ウィンドウ関数です。しかし、SQL Serverはこれをまだサポートしていません。 –

+0

@a_horse_with_no_name本当ですか?おそらく、このアプリケーションでどのように動作するのかわからないので、再帰的なcteをよく把握していることがあります。私は遅れについて聞いていない。たぶん私はカーソルとより手続き型のコード型ストアドプロシージャが必要です。 – StatsViaCsh

+0

'lag'は、前の行の列値にアクセスできる標準的なウィンドウ関数です。 –

答えて

2

; 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

+0

あなたは大歓迎です:) –

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