Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Durchschnittliche Anzahl an Tagen zwischen Daten

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von enti87, 9 September 2014.

  1. enti87

    enti87 Neuer Benutzer

    Hallo,

    ich bin Student und habe eine kleine Testdatenbank aufgebaut und versuche immer ein paar typische Analyseprobleme zu lösen.

    In meiner Datenbank habe ich Kunden und deren Einkäufe. Ich habe nun diverse Aggregatfunktionen berechnet und scheitere jetzt folgender Problemstellung - aller wie viel Tage kauft jeder Kunde ein.

    Die Daten liegen wie folgt vor (ganz hinten habe ich mit Excel mal die Tage ausgerechnet):

    OID CID orderDate
    10592727 166 07.06.2013 436
    10834758 166 17.08.2014
    10539840 187 28.10.2012 211
    10589684 187 27.05.2013 426
    10820631 187 27.07.2014
    10568750 204 07.03.2013 159
    10765602 204 13.08.2013 161
    10612328 204 21.01.2014 118
    10684149 204 19.05.2014
    10667686 220 09.09.2012 463
    10528139 220 16.12.2013

    Im Ergebnis sollte rauskommen:

    CID Durschnittliche Tage
    166 436
    187 318,5
    204 146
    220 463

    Wie kann ich das mit SQL machen? Jemand eine Idee? Datediff funktioniert ja nur mit 2 Werten und kann mir auch keinen AVG ausrechnen.

    Vielen Dank
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Über Window-Funktionen kannst Du via lag() die Differenz zum letzten Eintrag berechnen, über dieser Differenzen dann avg(). Ich denk mal, der M$SQL kann das. Falls noch Fragen sind zeige ich es Dir in PostgreSQL.
     
  3. ukulele

    ukulele Datenbank-Guru

    Das geht auch mit Hilfe eines Joins und einer Zeilennummerierung. Ich habs jetzt nur auf die Schnelle getestet:
    Code:
    WITH t AS (
    SELECT   CID,
         orderDate,
         ROW_NUMBER() OVER (PARTITION BY CID ORDER BY orderDate) AS zeilennr
    FROM   tabelle
    )
    SELECT   t1.CID,
         avg(datediff(day,t1.orderDate,t2.orderDate)) AS diff
    FROM   t t1
    LEFT JOIN t t2
    ON     t1.CID = t2.CID
    AND     t1.zeilennr = t2.zeilennr -1
    GROUP BY t1.CID
    ORDER BY t1.CID
    Wenn das Problem noch aktuell ist, erläutere ich das auch gern.
     
  4. enti87

    enti87 Neuer Benutzer

    Hallo.
    Ja das thema ist noch aktuell.

    Wollte mir über die uni noch mssql 2012 holen. Weil die lag Funktion nicht bei r2008 drin ist. Aber wenns auch so geht wärs cool.

    Ich guck heute abend mal drüber.

    Danke für die Antwort

    Vg enti
     
  5. ukulele

    ukulele Datenbank-Guru

    Das sollte auch mit MSSQL 2012 Express für Lau möglich sein.
     
  6. enti87

    enti87 Neuer Benutzer

    Funktioniert super! Vielen Dank...

    Habs mir noch bissl abgewandelt damit die Null - Werte replaced werden.

    Vielen Dank ukulele!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden