Хотя цикл заменить в SQL - PullRequest
0 голосов
/ 04 июля 2018

Пожалуйста, прочитайте код ниже, я использовал цикл while для получения 30 лучших, уменьшив критерии ADTV на 10%, будет продолжать уменьшаться до тех пор, пока я не достигну 30. Я хотел бы заменить цикл while

DECLARE
@parent_symbol NVARCHAR(20) = 'SXXE',
@index_symbol NVARCHAR(20) = 'ISX30P',
@top50_symbol NVARCHAR(20) = 'SX5E',
@true CHAR(4) = 'TRUE',
@false CHAR(5) = 'FALSE',
@top INT = 30,
@adtv_filter INT = 30000000,
@sector_max INT=6,
@count INT,
@adtv INT,
@remainingCount INT;

--select * from universe_temp where selection_flag = 'TRUE'
--Delete from universe_temp
    SET @count= (SELECT COUNT(dj_id) 
FROM universe_temp 
WHERE selection_flag= @true);
print(@count)
--while (@count<@top)
set @adtv = @adtv_filter-((10*@adtv_filter)/100)
print(@adtv)

set @remainingCount = @top-@count
print(@remainingCount)
while (@count<@top)
Begin
;with remaining_top as (
select top(@remainingCount) dj_id from universe_temp
                         WHERE selection_flag=@false and adtv3m >= @adtv and reason_for_rejection = 'Not in Top 30'
                         ORDER BY market_capitalization_rank
)


--select * from remaining_top

UPDATE u
            SET u.selection_flag=  @true
                --,u.reason_for_rejection= CASE  WHEN t.dj_id IS NULL AND u.reason_for_rejection IS NULL THEN 'Not in Top '+CAST(@top AS NVARCHAR) ELSE reason_for_rejection END
FROM universe_temp u 
         JOIN remaining_top t ON u.dj_id=t.dj_id

set @count= @count + (select count(*) from  universe_temp where selection_flag= @true)
        End

1 Ответ

0 голосов
/ 04 июля 2018

В этом сценарии так много проблем, что я не знаю, с чего начать. Нужно иметь в виду, что вы сокращаете свои критерии вне цикла, другое - вы добавляете к своему счету, а не обновляете его в конце каждого цикла и т. Д.

Если вы просто пытаетесь вытянуть верхние 30 «whatevers» по некоторым критериям, то это может помочь избежать использования петель?

--Deselect all rows
UPDATE universe_temp SET selection_flag = @false;

--Now select the top x
WITH Ranked AS (
    SELECT
        *,
        DENSE_RANK() OVER (ORDER BY adtv3m DESC, market_capitalization_rank DESC) AS rank_id 
    FROM
        universe_temp)
UPDATE
    r
SET
    selection_flag = @true
FROM
    Ranked r
WHERE
    r.rank_id <= @top;

--Find the threshold (bonus)
SELECT MIN(adtv3m) FROM universe_temp WHERE selection_flag = @true;

Но я действительно понятия не имею, чего вы пытаетесь достичь здесь, как вы вносите свои данные в эту таблицу "universe_temp", что это представляет и т. Д.

...