Tävlingsuppgift 2018

Challenge_ny-01[1]

Årets uppgift går ut på att lägga till rader i en loggningstabell så att loggningen blir komplett enligt ett förutbestämt intervall.

Figur1
Figur 1 – Tabellen dbo.Parameters

Det finns en tabell dbo.Parameters som innehåller ett valfritt antal produktionslinjer och varje produktionslinje har sitt eget intervall (angivet i minuter) för hur ofta det ska finnas rader i loggningstabellen. Varje produktionslinje kan ha allt från några tusen rader till flera miljoner rader, oavsett vilket intervall de har.

Figur2
Figur 2 – Tabellen dbo.Values

Som ni kan se är det dock inte alltid så att värdena kommer in på sekunden, eller ens på minuten. Exemplet ovan bygger på att loggningsvärdena för AssemblyLine C kommer var 30:e minut. Första gången kom den 5 minuter och 2 sekunder sent. Andra gången 13 minuter och 5 sekunder sent. Tredje gången 11 minuter och 14 sekunder sent. Fjärde gången 6 minuter och 8 sekunder sent.
Det får inte förekomma dubbla loggningar för samma tidsperiod.

Uppgiften går ut på att identifiera vilka produktionslinjer som har ofullständiga loggningar enligt det förutbestämda intervallet samt att föra in de saknade loggningsraderna.

För samma exempel nedan så saknas tidsangivelsen 1905-05-18 13:30:00, eftersom AssemblyLine C har ett intervall på 30 minuter.

Figur3

Du ska hitta alla dessa saknade loggningar och lägga in dem i tabellen (exakt enligt intervallet) så att det ser ut som följer.

Figur4

Skript för att skapa tabeller samt viss testdata finns att hämta hem här.

Årets tävlingsuppgift är konstruerad av Peter Larsson.

Vinnare är det tävlingsbidrag som ger rätt resultat och är snabbast, d v s har lägst duration. Högsta tillåtna antal tävlingsbidrag per deltagare är tre. Tävlingsbidragen testkörs först på en laptop för att verifiera att lösningarna ger rätt resultat. Tidtagningen sker på en Azure P11. Vinnaren kommer att tillkännages vid årsmötet 2018 och då kommer vinnaren också förklara och gå igenom sin lösning.

Ditt tävlingsbidrag ska bestå av ett fungerande skript som ska gå att köra i sin helhet. Datat som tävlingen körs på kan komma att utökas både med fler AssemblyLines och fler loggningsrader.

Frågor, förtydliganden?

Använd kommentarstråden här nedanför om du behöver hjälp med tolkning av uppgiften eller om det är något annat du undrar över!

När du känner dig klar

Skicka in ditt lösningsförslag här!

39 tankar om “Tävlingsuppgift 2018

  1. Hej,

    Kul tävling! Jag har inte deltagit tidigare, men skall försöka åstadkomma ett bidrag i år.

    En fråga:
    Kommer det kunna förekomma andra intervall än de som finns med i exempeldatat? Alltså, kan det vara vilken integer som helst, eller kommer det alltid vara något av värdena som nu finns i exempeldatat (5,15,30,45,60,90,120,180,720,1440)?

    Gilla

    • Ja, det kan förekomma vilket intervall ”som helst”. Det kan vara 30 minuter, det kan vara 17 minuter.
      Regeln är att intervallet börjar räknas 00:00 det första dygnet det finns en loggning för en produktionslinje.

      Gilla

      • Behöver vi hantera om Interval satts till 0 eller lägre?

        Med tanke på tidigare kommentar:
        2. Det är inte en ”normal” tabell utan den är producerad för att testa gränsvärden, som för alla tidigare tävlingar.

        Gilla

        • Hej.
          Detta är inget jag tänkt på för testdatan :-) så nej, det finns inga intervall som är 0 minuter eller har negativa värden.
          Men det är en bra input till nästa års tävling!

          Gilla

    • Det beror på vilken period du menar. Intervallen för varje produktslinje börjar 00:00:00 det dygn där den första loggning finns.
      Det eller de saknade värdena, enligt intervallet, ska föras in i tabellen med tidsdelen satt till hh:mm:00

      Gilla

      • I påståendet: ”Det eller de saknade värdena, enligt intervallet, ska föras in i tabellen med tidsdelen satt till hh:mm:00” syftar ”Det” på ”00:00:00 det dygn där den första loggning finns”? Betyder detta att ”00:00:00 det dygn där den första loggning finns” ska läggas till om den saknas samt alla (enligt intervallet) saknade loggningar fram till allra första loggning för en produktslinje?

        Gilla

        • Peter skrev följande på facebook (https://www.facebook.com/groups/sqlug.se/)

          – Skall man leta även efter saknade händelser som ligger före den första händelsen för en viss AssemblyLine.
          – Nej

          – Vad händer när en viss assemblyline missar flera events i rad.
          – Du ska lägga upp alla missade events

          – Kan tex interval vara 13 minuter?
          – Ja, därav att varje assemblyline antas starta 00:00 den första dagen det finns en loggning.

          – Vilken collation används?
          – Det är en case insensitive collation som används.

          Gilla

          • Inga saknade händelser före första händelsen för en viss AssemblyLine, alltså? Jag antar att man inte heller ska lägga till saknade händelser efter den sista registrerade händelsen för en AssemblyLine, eller?

            Gilla

          • Svar på Karfunkels fråga:
            Nej, man behöver inte lägga till saknade händelser efter den sista registrerade händelsen för en viss assemblyline.

            Gilla

          • Nej, inga loggningar före den första loggningen för respektive produktionslinje. Inte heller några loggningar efter den sista loggningen för respektive produktionslinje.

            Gilla

  2. Försökte skicka min lösning men får valideringsfel på odeklarerad variabel som är inparameter i en funktion. Meddelande jag får:
    {Vi försökte validera din kod och snubblade över följande fel:
    Must declare the scalar variable ”@amount”.
    Detta betyder att ditt bidrag inte har registrerats.}

    Verkar vara bristfällig valideringsfunktion.
    Går det att lösa?

    Gilla

  3. Kommer man få någon återkoppling på om en lösning man skickat in ger rätt eller fel resultat, innan tävlingsperioden är över?

    Gilla

  4. Ja, alla lösningar kommer att testas på en laptop först för att se om de ger rätt resultat.
    Tänk på att utnyttja de datatyper som är definierade i uppgiften och att det kan finnas flera miljoner rader för varje produktionslinje och att intervallet kan vara stort.

    Gilla

  5. Lite preliminära resultat angående tävlingen.

    Ingen har blivit godkänd än så länge!
    Oftast beror det på ett fel för DATEDIFF. ”The datediff function resulted in an overflow.”

    Tänk också på att det finns allt från några få rader till flera miljoner rader per produktionslinje. Intervallet för dessa kan vara allt från 1 minut upp till vad som ryms inom datatypen.
    Dvs en produktionslinje kan ha 3 rader där intervallet är 1 minut. En annan produktionslinje kan ha över 3 miljoner rader där intervallet är över 2880 minuter.

    Det kan finnas produktionslinjer som inte alls saknar loggningar, dvs alla loggningar finns som förväntat. Sedan kan det finnas produktionslinjer som saknar 1, 5, 20, 50 eller 80 procent av loggningarna.

    1. Tänk på datatyperna i tabellerna och vad som är giltiga värden för den domänen som innefattas av datatypen.
    2. Det är inte en ”normal” tabell utan den är producerad för att testa gränsvärden, som för alla tidigare tävlingar.

    Hoppas detta klargör några funderingar.

    //Peter

    Gilla

  6. Det är också så att från och med den första dagen det kommer in loggning för en produktionslinje, så börjar intervallet ticka från och med 00:00:00 den dagen, med det förutbestämda intervallet.

    Det kan vara så att en loggning kommer lite senare än tänkt. Nästa period är enligt intervallet och den kan också komma försent.

    T.ex Om intervallet är 30 minuter, och en post skulle komma 15:00 så kanske den loggningen kommer 15:02:17.
    Nästa loggning, enligt intervallet, ska komma 15:30 men den kommer kanske inte förräm 15:49:11

    Båda loggningarna ligger inom intervallets giltighet.

    Gilla

    • följdfråga på ”intervallets giltighet.”
      är en loggning korrekt förutsatt att den kommer i rätt tidsperiod, dvs en loggning kan vara hur sen som helst så länge den inte kommer i nästa period

      givet tidsintervall 30 min så är denna loggning komplett/riktig?
      15:00:00
      15:59:59
      16:00:00

      denna loggning är inkorrekt?
      15:00:00
      15:30:00
      15:59:59

      Gilla

      • Ett litet förtydligande:

        Den sista loggningen är inkorrekt på så sätt att den inte kan förekomma i indatan, dvs man behöver inte ha någon kod som tar hänsyn till det fallet.

        Både 15:30:00 och 15:59:59 ligger inom intervallet som börjar 15:30:00 och är 30 minuter långt.

        (Om jag har tolkat uppgiften korrekt)

        Gilla

  7. Kan vi utgå från att tiderna matats in i UTC och ej i CET med daylight saving? Dvs kan vi ignorera sommartid/vintertid?

    Om vi bortser från antagandet i uppgiften om dubba tider. Borde det inte finnas risk för dubbla tider i en implementation där CET använts? Tänker på dagen man ställer tillbaka klockan en timma.

    Sitter förövrigt och försöker förstå varför SQL Servers tidszonsomvandling ger dubbla tider på våren när vi flyttar fram klockan. Se första remarks’en på https://docs.microsoft.com/en-us/sql/t-sql/queries/at-time-zone-transact-sql.

    Känner att det börjar bli dags att börja tänka på annat nu :)

    Gilla

  8. Hej alla.
    Det har visat sig att EXCEPT har en bugg på min laptop, den visar rätt resultat två gånger av tre.
    Jag har nu laddat hem den senaste CU och nu är EXCEPT konsekvent.

    Som en följd av detta KAN någon eller några lösningar felaktigt ha givit en felaktig validering. För att kompensera er, får ni alla skicka in en fjärde lösning.

    Jag håller på att validera alla inskickade lösningar igen efter nya CU. Kommer att posta både här och i Facebookgruppen vilka lösningar som är validerade.

    Det har kommit lösningar som kört mellan 30 och 5400 sekunder. Mediantiden är 120 sekunder.

    Gilla

  9. Dessa lösningar är validerade. Listan är i ordning efter inlämnad ordning.

    Mikael Eriksson (Bidrag 2)
    Michael Berndtsson (Förslag nr 1 Berndtsson)
    Sergey Klimkevich (Bidrag 2)
    Gustav Egedal Rydell (GustavEgedalRydell_V1)
    Jonas Claudelin (Two)
    Michael Berndtsson (Take2)
    Sergey Klimkevich (Bidrag 3)
    Lars-Ove Johansson (Attempt002)
    Åke Mattsson (Verify #2)
    Georgiana Ostafiev (2)
    Christian Mosebach (Försök 3)
    Georgiana Ostafiev (3)
    Åke Mattsson (Bidrag #3)
    Lars-Ove Johansson (Attempt003)
    Sergey Klimkevich (GapsIslands)
    Lars-Ove Johansson (Attempt004)

    Tänk på att ni får lämna in ett fjärde bidrag i år.

    Gilla

  10. Hej,
    Hur fort kan man vänta sig få ett meddelande om att ens bidrag är validerat eller inte? Eller att det ens är mottaget?

    Gilla

    • Både hemsidan och Facebookgruppen bli uppdaterad så fort jag kommer åt det insickade bidraget. Det rör sig i normal fall att jag uppdaterar dessa samma dag.

      Gilla

Skriv något snällt om den här artikeln!

Denna webbplats använder Akismet för att minska skräppost. Lär dig om hur din kommentarsdata bearbetas.