Nu drar årets svenska mästerskap för SQL Server utvecklare igång, arrangerat av SQLUG. Uppgiften är relativt enkel att komma igång med men svår att lösa optimalt.
Tävlingen är både individuell och per företag. Som tävlande representerar man både sig själv som individ och det företag man jobbar på.
Bästa individuella insats vinner ett presentkort på 990 kr hos Liveit, som kan användas till vin- och chokladprovning för två, prova stridsflygsimulator, spabehandling eller vad man nu föredrar.
De fem bästa företagen belönas med varsin licens av SQL Source Control, som möjliggör källkodshantering i SQL Server på samma sätt som man hanterar programkod i t ex Visual Studio Team System, värde $295.
Den största vinsten är naturligtvis äran att kunna titulera sig vinnare i SQLug.se challenge 2010!
Tävlingsuppgift
Vi har samlat in mätvärden från en bränslemätare hos ett antal fordon i en tabell som heter MeterReadings.
|
ID
|
Tid
|
VehicleName
|
MeterValue
|
|
1
|
2010-02-01 08:00:00.000
|
LIFT1
|
10000
|
|
2
|
2010-02-01 08:05:00.000
|
LIFT1
|
10025
|
|
3
|
2010-02-01 08:15:00.000
|
LIFT1
|
10065
|
|
4
|
2010-02-01 08:15:00.000
|
LIFT2
|
20000
|
|
5
|
2010-02-01 08:30:00.000
|
LIFT2
|
20150
|
|
6
|
2010-02-01 09:05:00.000
|
LIFT1
|
10315
|
|
7
|
2010-02-01 09:10:00.000
|
LIFT2
|
20510
|
|
8
|
2010-02-01 09:55:00.000
|
LIFT2
|
20810
|
|
9
|
2010-02-01 10:00:00.000
|
LIFT1
|
10480
|
|
10
|
2010-02-01 10:00:00.000
|
LIFT2
|
20885
|
|
11
|
2010-02-01 10:10:00.000
|
LIFT1
|
10530
|
|
12
|
2010-02-01 10:15:00.000
|
LIFT1
|
10575
|
|
13
|
2010-02-01 11:00:00.000
|
LIFT1
|
10725
|
|
14
|
2010-02-01 11:05:00.000
|
LIFT2
|
21445
|
|
15
|
2010-02-01 11:05:00.000
|
LIFT1
|
10755
|
|
16
|
2010-02-01 11:50:00.000
|
LIFT1
|
11295
|
|
17
|
2010-02-01 12:00:00.000
|
LIFT1
|
11325
|
Man kan beräkna förbrukningen genom att ta differensen mellan två avlästa värden. T ex hade LIFT1 en förbrukning på 25 cl mellan kl 08:00 och 08:05. Förbrukningen var då 5 cl per minut.
Uppgiften är att beräkna den tidsviktade genomsnittliga förbrukningen, i centiliter per minut, för de 20% perioder som hade den högsta förbrukningen/minut (avrunda antal perioder uppåt till närmaste heltal så det blir t ex 3 perioder om det totalt finns 11 perioder). Om flera perioder har samma förbrukning/minut, så välj de senaste perioderna.
Se exempel nedan för LIFT1.
|
VehicleName
|
StartTime
|
EndTime
|
Consumption
|
TimeInMinutes
|
ConsumptionPerMinute
|
|
LIFT1
|
08:00:00
|
08:05:00
|
25
|
5
|
5
|
|
LIFT1
|
08:05:00
|
08:15:00
|
40
|
10
|
4
|
|
LIFT1
|
08:15:00
|
09:05:00
|
250
|
50
|
5
|
|
LIFT1
|
09:05:00
|
10:00:00
|
165
|
55
|
3
|
|
LIFT1
|
10:00:00
|
10:10:00
|
50
|
10
|
5
|
|
LIFT1
|
10:10:00
|
10:15:00
|
45
|
5
|
9
|
|
LIFT1
|
10:15:00
|
11:00:00
|
150
|
45
|
3,33333333333333
|
|
LIFT1
|
11:00:00
|
11:05:00
|
30
|
5
|
6
|
|
LIFT1
|
11:05:00
|
11:50:00
|
540
|
45
|
12
|
|
LIFT1
|
11:50:00
|
12:00:00
|
30
|
10
|
3
|
Totalt har vi 10 perioder så 20% motsvarar två perioder. De två perioder med högst förbrukning hade 12 cl/minut respektive 9 cl/minut och de hade en varaktighet på 45 respektive 5 minuter.
Den tidsviktade genomsnittliga förbrukningen för LIFT1 blir då:
(12 x 45 + 9 x 5) / (45 + 5) = 11,7 cl/minut.
Samma beräkning, fast för LIFT2 ger en genomsnittlig förbrukning på 15 cl/minut.
Tävlingsuppgiften är att skriva snabbast möjliga T-SQL / SQL CLR lösning för att göra denna beräkning. Vi kommer att provköra era lösningar på indata bestående av cirka 1 miljon rader på en maskin som kör SQL Server 2008 R2 Enterprise Edition och har en quadcore CPU.
Utresultatet skall skrivas till en tabell som heter ConsumptionSummary.
|
VehicleName
|
Top20PctAveragePerMinute
|
|
LIFT1
|
11,7
|
|
LIFT2
|
15
|
Material
Script för att skapa tabellerna: SQLUGChallenge2010Setup.txt
Testdata (cirka 200 000 rader, slumpade): SQLUGChallenge2010.zip
För att läsa in testdata, zippa upp på valfri plats och skriv
BULK INSERT MeterReadings FROM 'Sökväg till filen' WITH (FIRSTROW = 2)
Facit för dessa 200 000 rader.
| VehicleName |
Top20PctAveragePerMinute |
| LIFT1 |
8202.18834892846 |
| LIFT2 |
27949.9640499379 |
| LIFT3 |
13310.5810794649 |
| LIFT4 |
19097.1263597138 |
Regler
- Tävlingen är öppen för alla SQLUGs medlemmar.
- Tävlingsbidrag postas som svar på detta forum. De skall märkas med namn och företag.
- Vinnare är den/de som har presterat den snabbaste lösningen.
- Tillåtna metoder är T-SQL och SQL CLR. SQL CLR måste köras i safe läge och källkoden måste bifogas.
- Inga schemaförändringar på befintliga tabeller är tillåtna förutom att skapa icke-klustrade index.
- Det är tillåtet att skapa index, vyer, funktioner och procedurer (men ej indexerade vyer). Lösningarna måste städa upp efter sig så att den kan köras om och om igen. Posta din lösning uppdelad på tre script: Setup, Huvudkod, Uppstädning
- Eventuell vinstskatt betalas av vinnarna.
- Lösningarna kommer att testköras på cirka 1 miljon rader. Vi reserverar oss för möjligheten att öka antalet rader med testdata om det skulle krävas för att tävlingen skall bli utslagsgivande.
- Tävlingen avgörs av en jury som består av Johan Åhlén, Tibor Karaszi och Lars Utterström.
- Deadline för att komma med tävlingsbidrag är 30 november kl 22:00 (svensk tid).
Vinster
Individuell tävling: Första pris är ett presentkort på 990 kr från liveit.se
Företagstävling: Fem bästa lösningarna vinner en licens av SQL Source Control
Hur du tävlar
Posta din lösning på det här forumet. Skriv ditt namn och företagsnamn (om du också representerar ett företag/organisation).
Frågor
Frågor angående tävlingen ställs i detta forum.
Lycka till!