Losowanie krotki

0

Chodzi o polecenie SQL które wylosowałoby krotkę z relacji zgodnie z prawdopodobieństwami zapisanymi w tej relacji.

Fajnie by było gdyby jeszcze przed zwróceniem wylosowanej krotki ustawiło (UPDATE) jeden z jej parametrów.

Żeby być precyzyjnym załóżmy, że mamy relację R=(ID,P,U)
ID - klucz;
P - prawdopodobieństwa poszczegulnych krotek tzn prawdopodobieństwo wylosowania danej jest równe ID/sum(ID) czyli stosunkowi wartości do sumy w całej relacji;
U - atrybut który ma być ustawiony na 1 dla wylosowanej krotki;

Ja to robię w m$SQL server 2005 ;]

ps: jakby ktoś nie wiedział co to jest Krotka ;]

0

Dobra, ja wykombinowałem coś takiego ;-P

declare @v bigint,@sh bigint,@sum bigint,@id bigint
set @id=-1
set @sum=(select sum(p) from R)
set @v=cast((rand()*@sum)as bigint)
declare cur cursor fast_forward for select p,id from R order by p
open cur
fetch next from cur into @sh,@id
set @v=@v-(@sum-@sh)
while(@@FETCH_STATUS=0 and @v>0)
begin
 fetch next from cur into @sh,@id
 set @v=@v-(@sum-@sh)
end 
close cur
update R set u=1 where id=@id
select @id as id

I w sumie chyba działa :)
...tylko fajnie by było, żeby w razie braku krotek zwracało pusty wynik zapytania (teraz zwraca krotkę z id=-1) - wiem marudze :P zresztą i tak pewnie zawsze będe miał jakieś krotki w bazie ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1