en-USsv-SE
Du är här:   Forum
HemHemSQLug.SESQLug.SETävlingarTävlingarSQLug.se challenge 2010SQLug.se challenge 2010
Föregående
 
Nästa
Nytt inlägg
2010-10-27 21:41
 
Är det inte bättre att maila in koden och att ni redovisar de olika bidragen samtidigt?
 
Nytt inlägg
2010-10-27 22:31
 
För min egen del föredrar jag öppna tävlingar, dvs att bidragen är publika och att den aktuella ställningen redovisas efterhand som bidragen kommer in. Det finns mest fördelar med detta.
Nackdelen är att det inte blir en tävling i sitt eget ords bemärkelse. Men eftersom SQLUG.se samt PASS Scania (som jag representerar) i första hand handlar om "Connect, Share and Learn" så överväger fördelen med att kunna studera och ta till sig andras lösningar.
Tänk om din lösning kör på 7 sekunder och någon annan postar en lösning som kör på 4 sekunder. Jag vet inte hur du reagerar men jag skulle studera den noggrant för att se dels vad jag själv inte tänkte på, dels eventuellt lära mig något nytt och kanske till och med förbättra den snabbare lösningen.
Uppenbara plagiat kommer Johan att genomskåda om den inte tillför något nytt och kommer då att vara utan tävlan.

//Peter
 
Nytt inlägg
2010-10-28 19:35
 
Hej Panos,

Tack för ditt tävlingsbidrag! Jag har testat din lösning och fått följande resultat:

Exekveringstid: 2,75 s

(dessutom lite statistik som kan vara intressant - CPU-tid: 8,25 s och antal reads: 455419)

Tyvärr stämmer inte resultatet riktigt (även om du är nära). Ett tips är att kolla igenom noga vilka perioder som räknas med.

När fler tävlingsbidrag kommer in så kommer vi att publicera en "high-score" lista.

Lycka till och kom ihåg att tävlingen pågår till den 30:e november.

MVH
Johan
 
Nytt inlägg
2010-10-28 19:47
 
Henge skrev:
Är det inte bättre att maila in koden och att ni redovisar de olika bidragen samtidigt?

Nej, vi har valt att köra en öppen tävling eftersom syftet är att göra detta till en lärande aktivitet. Men det är inget som hindrar att du postar din lösning i sista minuten om du vill hålla den hemlig.

MVH
Johan

 
Nytt inlägg
2010-11-06 00:25
 
Hej,

Jag har en lösning med en CTE och lite ranking funktioner.

Först så ska man skapa det här indexet.

CREATE NONCLUSTERED INDEX IX_VehicleName_StartTime ON dbo.MeterReadings (VehicleName ASC, StartTime ASC) INCLUDE (MeterValue)

Sedan så är scriptet här.

WITH MeterReadingsRowNumber AS (

SELECT VehicleName,
ROW_NUMBER() OVER (PARTITION BY VehicleName ORDER BY StartTime ASC) AS RowNumber,
StartTime,
MeterValue
FROM MeterReadings

),

Periods AS (

SELECT MeterReadingsRowNumber1.VehicleName,
MeterReadingsRowNumber1.StartTime StartTime,
MeterReadingsRowNumber2.StartTime EndTime,
CAST(MeterReadingsRowNumber2.MeterValue - MeterReadingsRowNumber1.MeterValue AS float) AS Consumption,
CAST(DATEDIFF(ms,MeterReadingsRowNumber1.StartTime,MeterReadingsRowNumber2.StartTime) AS float) / 1000 / 60 AS TimeInMinutes,
CAST(MeterReadingsRowNumber2.MeterValue - MeterReadingsRowNumber1.MeterValue AS float) / DATEDIFF(ms,MeterReadingsRowNumber1.StartTime,MeterReadingsRowNumber2.StartTime) * 1000 * 60 AS ConsumptionPerMinute
FROM MeterReadingsRowNumber MeterReadingsRowNumber1
INNER JOIN MeterReadingsRowNumber MeterReadingsRowNumber2
ON MeterReadingsRowNumber1.VehicleName = MeterReadingsRowNumber2.VehicleName
AND MeterReadingsRowNumber1.RowNumber = MeterReadingsRowNumber2.RowNumber -1

),

PeriodsPercentile AS (

SELECT VehicleName,
StartTime,
EndTime,
Consumption,
TimeInMinutes,
ConsumptionPerMinute,
NTILE(100) OVER (PARTITION BY VehicleName ORDER BY ConsumptionPerMinute DESC, StartTime DESC) AS Percentile
FROM Periods

)

MERGE INTO ConsumptionSummary AS TARGET
USING
(

SELECT VehicleName, SUM(Consumption) / SUM(TimeInMinutes) AS Top20PctAveragePerMinute
FROM PeriodsPercentile
WHERE Percentile <= 20
GROUP BY VehicleName

) AS SOURCE
ON TARGET.VehicleName = SOURCE.VehicleName

WHEN MATCHED THEN UPDATE SET Top20PctAveragePerMinute = SOURCE.Top20PctAveragePerMinute
WHEN NOT MATCHED BY TARGET THEN INSERT (VehicleName, Top20PctAveragePerMinute) VALUES (VehicleName, Top20PctAveragePerMinute)
WHEN NOT MATCHED BY SOURCE THEN DELETE;

Det tar ca 3 sekunder på min dator.

M.v.h.

Ola
 
Föregående
 
Nästa
HemHemSQLug.SESQLug.SETävlingarTävlingarSQLug.se challenge 2010SQLug.se challenge 2010


Annons