0

最初のネストされたカーソル 'uncalcdays' がデータを返しません。最初の (ネストされていない) カーソル「codes」は正しいデータを返し、このデータを変数 @codes に正しく渡しています。

uncalcdays から sql を切り取り、別のクエリ ウィンドウで実行すると、データが返されます。'codes' と 'uncalcday' から SQL を切り取り、適切な変数を作成して別のクエリ ウィンドウで実行すると、どちらも正しいデータを返します。

これは私の頭をやっています!私が間違っていることは明らかですか..?

計画は、子データを持たない最初のマスター レコード (つまり、子レコードを持たない最小 ID のマスター レコード) を特定する必要があるということです。

Rgdsデイブ

SET NOCOUNT ON;

declare @code nvarchar(10)
declare @id numeric
declare @val numeric
declare @total numeric
declare @count numeric
declare @avg numeric
declare @fetch_codes int
declare @fetch_uncalcdays int
declare @fetch_twentyvals int

-- get a list of codes
declare codes cursor for 
    select distinct code from dbo.EOD_Data;

-- get a list of the days that are unprocessed
declare uncalcdays cursor for 
    select d.id
        from dbo.EOD_Data d
             left outer join dbo.EOD_Computed_Stats cs
             on d.id = cs.EOD_Data_Id
       where cs.SMA_20D is null
         and d.CODE = @code
       order by d.id asc; 

-- get the last 20d data for a given stock code
declare twentyvals cursor for 
    select top(20) d.id 
    from dbo.EOD_Data d
    where d.id <= @id
      and d.code = @code
    order by d.id desc;

-- loop through stock codes
open codes
fetch next from codes
    into @code
select @fetch_codes = @@FETCH_STATUS

while @fetch_codes = 0
begin

    open uncalcdays
    fetch next from uncalcdays
      into @id
    select @fetch_uncalcdays = @@FETCH_STATUS

    while @fetch_uncalcdays = 0
    begin

        -- loop through the twenty most recent close prices and calc average
        open twentyvals
        fetch next from twentyvals
            into @val
        select @fetch_twentyvals = @@FETCH_STATUS

        while @fetch_twentyvals = 0
        begin

            ...stuff

        fetch next from uncalcdays
            into @id
        select @fetch_uncalcdays = @@FETCH_STATUS

    end

    close uncalcdays
    deallocate uncaldays

fetch next from codes
    into @code
select @fetch_codes = @@FETCH_STATUS

end

close codes
deallocate codes

終わり

4

1 に答える 1

0

カーソルはコード化してトラブルシューティングを行うのに便利で、非常に役立ちますが、代わりにこのコードを試してください。一度に個々のレコードではなく一連の株式に対して機能します。

    --STEP 1 - Get list of unprocessed stocks
    SELECT d.Code
    INTO #unprocessedCodes
    FROM dbo.EOD_Data d
         LEFT OUTER JOIN dbo.EOD_Computed_Stats cs
            ON d.id = cs.EOD_Data_Id
    WHERE cs.SMA_20D IS NULL 

    --STEP 2 - Rate the data base on the date id
    SELECT 
        ROW_NUMBER() OVER ( PARTITION BY Code ORDER BY d.Code, d.id ASC) AS RowNumber,
        d.Price,  --it is good if you have closed price in the table, 
                  --otherwise you would add a join
        d.id AS DateID, 
        d.Code
    INTO #PricingChart
    FROM dbo.EOD_Data d
        INNER JOIN #unprocessedCodes uc
            ON d.Code = uc.Code

    --STEP 3 - Get average of first 20 prices for all unprocessed codes 
    SELECT 
        Code,
        AVG(Price) AS AvgPrice 
    FROM #PricingChart
    WHERE RowNumber <= 20 --you only interested in top 20
    GROUP BY Code

できるだけテーブルの近くにとどまろうとしましたが、これは完璧ではありませんが、カーソル内の多くのレコードをループするよりも高速かもしれません。

于 2014-10-13T21:33:42.763 に答える