sternis: höchsten Datumswert aus Tabelle auslesen

Hallo!

Ich speichere bei jedem Login eines Nutzers den Namen und die Uhrzeit in eine Tabelle in einer MS SQL-Datenbank.

Ich möchte jetzt gern all die Namen ausgeben, wo das letzte Login 30 Tage zurückliegt.

Schaffe ich das mit einer einzigen Anweisung?

Mit einem

select * from tabelle where loginzeit < '2012-07-01'

komme ich nicht weit. Da erhalte ich zwar alle Logins vom vor 30 Tagen, aber es ist nicht gesagt, dass dies auch das wirklich letzte Login des Nutzers war, sondern nur, ob es Nutzer gab, die sich vor dem 1.7.2012 eingeloggt haben.

Vielen Dank,
Bastian

  1. Hello,

    Ich speichere bei jedem Login eines Nutzers den Namen und die Uhrzeit in eine Tabelle in einer MS SQL-Datenbank.

    Ich möchte jetzt gern all die Namen ausgeben, wo das letzte Login 30 Tage zurückliegt.

    also nicht in der Menge der letzten Tage enthalten ist...

    Schaffe ich das mit einer einzigen Anweisung?

    Mit einer Ausschlussabfrage. Dazu eröffnet man das Select üblicherweise zweimal auf dieselbe Tabelle, wenn denn die Namen und die Logins in einer Tabelle stehen.

    Und dann über die Namen gruppieren

    Wie das nun mit M$-SQL genau heißt, weiß ich nicht. Aber das müsstest Du hinbekommen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      Ich speichere bei jedem Login eines Nutzers den Namen und die Uhrzeit in eine Tabelle in einer MS SQL-Datenbank.

      Ich möchte jetzt gern all die Namen ausgeben, wo das letzte Login 30 Tage zurückliegt.

      also nicht in der Menge der letzten Tage enthalten ist...

      Schaffe ich das mit einer einzigen Anweisung?

      Mit einer Ausschlussabfrage. Dazu eröffnet man das Select üblicherweise zweimal auf dieselbe Tabelle, wenn denn die Namen und die Logins in einer Tabelle stehen.

      Und dann über die Namen gruppieren

      Wie das nun mit M$-SQL genau heißt, weiß ich nicht. Aber das müsstest Du hinbekommen.

      aber hier ein Hinweis auf ein ähnliches Problem
      http://www.ms-office-forum.net/forum/showthread.php?t=180502

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. hi,

    mir würde da Spontan group by einfallen. Dadurch hast du die benutzer nur jeweils einmal, musst es aber vorher sortieren, damit im group der höchste raus kommt. Darum müsste das 2. select mit der Where < gewünschtes Datum.

    So als Denkanregung nach 10h arbeiten ;)

    Gruß Niklas

    --
    Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    1. Hello,

      mir würde da Spontan group by einfallen. Dadurch hast du die benutzer nur jeweils einmal, musst es aber vorher sortieren, damit im group der höchste raus kommt. Darum müsste das 2. select mit der Where < gewünschtes Datum.

      So als Denkanregung nach 10h arbeiten ;)

      Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo,

        Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.

        nö, ein einfaches HAVING mit MAX(loginzeit) < ... sollte reichen.

        Freundliche Grüße

        Vinzenz

        1. Hello,

          Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.

          nö, ein einfaches HAVING mit MAX(loginzeit) < ... sollte reichen.

          Nette Idee. Ich kriegs leider nicht hin.
          Könntest Du bitte noch mal zeigen?

          Bastian wollte ja alle User sehen, die sich schon länger als Datum-x nicht angemeldet haben.

          also über die User gruppieren und dann ?

          SELECT user, logindate
             FROM logindata
             GROUP BY user
             HAVING MAX(logindate) < '#datum#';

          Mit MySQL müsste das doch auch so funktionieren. Da bekomme ich immer "you have an error near heaving" oder soweas ähniches

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. hi,

            Hello,

            Das ist nur die halbe Miete, weil er ja gerade ausschließen muss, dass es in der Ergebnismenge überhaupt welche gibt, die ein Datum >= Wunschdatum haben... Wenn ich die Aufgabenstellung richtig verstanden habe.

            nö, ein einfaches HAVING mit MAX(loginzeit) < ... sollte reichen.

            Nette Idee. Ich kriegs leider nicht hin.
            Könntest Du bitte noch mal zeigen?

            Bastian wollte ja alle User sehen, die sich schon länger als Datum-x nicht angemeldet haben.

            also über die User gruppieren und dann ?

            SELECT user, logindate
               FROM logindata
               GROUP BY user
               HAVING MAX(logindate) < '#datum#';

            Mit MySQL müsste das doch auch so funktionieren. Da bekomme ich immer "you have an error near heaving" oder soweas ähniches

            du kannst in having nur verwenden, was auch im select steht (max ist dort nicht). Daher vermutlich der fehler ... so auf die fixe vermutet.

            von einem anderen thema bei mysql.com hab ich diese lösung, die dürftest du für dich anpassen können:

            SELECT l.LogID, l.FileID, l.ChangeDate, l.Freitext  
            FROM log AS l  
            WHERE l.ChangeDate=(SELECT MAX(ls.ChangeDate) FROM log AS ls WHERE ls.FileID=l.FileID)  
            GROUP BY l.FileID 
            

            auf jeden fall wirst du einen fehler bekommen, da das group by dir das wohl nicht so groupieren wird, wie es für dich sinnvoll ist (er älteste eintrag wird vermutlich angezeigt, da er der mit der kleinsten internen id ist).
            Gruß Niklas

            --
            Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
      2. hi,

        durch das Group By auf eine geordnete liste erhält er die jeweils höchsten Einträge der User. Diese dann noch mals Filtern dass eben die älter als 30 Tage genommen werden.

        Geht sicher noch anders, aber so als Anregung eben =) (immerhin wird die Liste durch das Group sofort deutlich kleiner). Zur Not geht man es dann bei der Ausgabe durch. (Ich würde die Chance nutzen und einfach 2-3 Anzeigen machen.(online die letzten 10 tage, online 10-30 tage, älter als 30 tage)

        Aber das nur so btw

        Gruß Niklas

        --
        Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    2. mir würde da Spontan group by einfallen.

      Vielen Dank, das hat mir geholfen.

      Schöne Woche euch allen noch.