2012-02-07 12 views
0

ストアドプロシージャでSQL SELECTクエリを構成するために必要なロジックに苦労しています。私のデータベースは株式市場のデータで動作します。私は、2012年の取引日表、ティッカー記号の表、およびこれらの記号と取引日の日々の価格データの表をWebサービス経由で持っています。私は苦労している私の選択したクエリからコンポーネントで書かれたWebサービスのアドレス文字列を取得しようとしています。ストアドプロシージャのSQLサーバー選択クエリヘルプ

以下の最初の手順は、「シンボル、開始日、終了日」フィールドに開始日と終了日が、シンボルごとに必要な最新のデータポイントと最新のデータポイントを持つレコードを返すのに十分適しています。

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 

私はすでに私の価格表の必要なデータの一部を持っているかもしれません:私の問題は、私は戻って私の分を与えるとmaxは私のような必要なシンボルあたりのテーブルから日付の行を取得するかもしれないが、あります私は戻って、この場合、取得したいと思い何

AAPL, 1/5/12- 1/9/12 

は次のようになります:代わりに、上記の銘柄記号と最初の例の

AAPL, 1/1/12, 1/4/12 
AAPL, 1/10/12, 1/10/12 

ているような日付範囲内の点、。手続き型コードでループすることでこれを簡単に行うことができますが、これはdb側で実装されていることを確認したいと思います。何か案は?ありがとうございます...

答えて

1

再帰はあなたの答えです。内側の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 

enter image description here

+0

私はそれを感謝..私は、SQLでの再帰に新しいんだけど、私はそれを実装しようとするでしょう。私は「典型的な」select文がそれをしないと感じていました。ありがとう。 – StatsViaCsh

関連する問題