Superenalotto & TSQL

Published 14 ottobre 08 06.46 | abenedetti

La febbre da Superenalotto sta contagiando moltissimi, anche chi non ha mai giocato prima d'ora.

Insomma, il premio in palio fa parecchia gola, soprattutto in tempo di crisi, no?

Se devo fare una confessione anche io ho speso un euro oggi... e mi sono lasciato tentare.

Poi mi sono preso una mezz'oretta ed ho giocato una cifra ben più alta, ma tutta virtuale.

In pratica ho fatto mille giocate e domani voglio proprio vedere se qualcuna di queste è quella corretta (poi, se dovesse uscire quella corretta, non so come la prenderei... :-))

Detto questo ecco quello che ho fatto, in TSQL, of course...

1. Creo la tabella in cui memorizzare le giocate (una riga per giocata, con la memorizzazione delle diverse sei cifre):

IF OBJECT_ID('dbo.enalotto', 'U') IS NOT NULL DROP TABLE dbo.enalotto GO create table dbo.enalotto ( idRecord int primary key identity(1,1), num1 tinyint, num2 tinyint, num3 tinyint, num4 tinyint, num5 tinyint, num6 tinyint, numUnique bigint unique, check (num1 <> num2 and num1 <> num3 and num1 <> num4 and num1 <> num5 and num1 <> num6), check (num2 <> num1 and num2 <> num3 and num2 <> num4 and num2 <> num5 and num2 <> num6), check (num3 <> num1 and num3 <> num2 and num3 <> num4 and num3 <> num5 and num3 <> num6), check (num4 <> num1 and num4 <> num3 and num4 <> num2 and num4 <> num5 and num4 <> num6), check (num5 <> num1 and num5 <> num3 and num5 <> num4 and num5 <> num2 and num5 <> num6), check (num6 <> num1 and num6 <> num3 and num6 <> num4 and num6 <> num5 and num6 <> num2) ) go

2. faccio 1.000 giocate:

set nocount on declare @i int set @i = 0 while @i < 1000 begin begin try insert enalotto select num1, num2, num3, num4, num5, num6, cast( cast(num1 as bigint) * 10000000000 + cast(num2 as bigint) * 100000000 + cast(num3 as int) * 1000000 + cast(num4 as int) * 10000 + cast(num5 as int) * 100 + num6 as bigint) as u from ( SELECT CONVERT(tinyint, (90)*RAND()) + 1 as [num1], CONVERT(tinyint, (90)*RAND()) + 1 as [num2], CONVERT(tinyint, (90)*RAND()) + 1 as [num3], CONVERT(tinyint, (90)*RAND()) + 1 as [num4], CONVERT(tinyint, (90)*RAND()) + 1 as [num5], CONVERT(tinyint, (90)*RAND()) + 1 as [num6] ) T set @i = @i + 1 end try begin catch end catch end go

3. le vedo (faccio una select della tabella così come è popolata):

--> queste le giocate select * from enalotto go

image

4. le vedo su riga (quindi sei righe per ogni giocata):

--> vedo su riga le giocate select idRecord, num1 from enalotto union all select idRecord, num2 from enalotto union all select idRecord, num3 from enalotto union all select idRecord, num4 from enalotto union all select idRecord, num5 from enalotto union all select idRecord, num6 from enalotto order by idRecord

image

5. ordino le giocate dal numero più piccolo (con la funzione row_number, mi serve per sapere l'ordine di visualizzazione):

--> ordino le giocate dal numero più piccolo select idRecord, Num, ROW_NUMBER() OVER(partition by idRecord order by num ) as ord from ( select idRecord, num1 as num from enalotto union all select idRecord, num2 from enalotto union all select idRecord, num3 from enalotto union all select idRecord, num4 from enalotto union all select idRecord, num5 from enalotto union all select idRecord, num6 from enalotto ) tabellaGiocateSuRiga order by idRecord

image

6. visualizzo l'estrazione completa dal numero più piccolo (tramite la funzione pivot giro le righe con le colonne ed ottengo la visualizzazione corretta):

--> visualizzo di nuovo in colonna, dal numero più piccolo select idRecord, [1], [2], [3], [4], [5] , [6] from ( select idRecord, Num, ROW_NUMBER() OVER(partition by idRecord order by num ) as ord from ( select idRecord, num1 as num from enalotto union all select idRecord, num2 from enalotto union all select idRecord, num3 from enalotto union all select idRecord, num4 from enalotto union all select idRecord, num5 from enalotto union all select idRecord, num6 from enalotto ) tabellaGiocateSuRiga ) Tab pivot ( sum(Num) for ord in ([1],[2],[3],[4],[5],[6]) ) as pivotTable order by idRecord

image

Filed under: , ,

Comments

# abenedetti said on ottobre 15, 2008 05.26 :

Eh... ho fatto un misero 4...

Quindi: avrei speso 500 €, per vincerne poco più di 300 €

# fdechirico said on ottobre 16, 2008 09.44 :

Di questi tempi ... sempre meglio che giocare in borsa!:-)

# ibrusett said on ottobre 16, 2008 10.54 :

interessante sarebbe anche uno script che verifichi quante e quali combinazioni sono vincenti.

O è banale e io non ci arrivo?

# Il blog di Andrea Benedetti said on ottobre 16, 2008 11.53 :

Stimolato da un commento sul mio post precedente provo a postare una soluzione per verificare quante

# abenedetti said on ottobre 16, 2008 11.55 :

Ho provato a postare una soluzione sul blog (era un pò lunga per un commento)...

Che ne dici?

# ibrusett said on ottobre 16, 2008 01.46 :

Che sto per convincere i miei colleghi a fare un sistema con 100 giocate!

# abenedetti said on ottobre 16, 2008 02.11 :

Occhio che io ho simulato 100.000 giocate e ho fatto circa 1.200 € di vincite... :-(

This Blog

Syndication