Datensätze die in den letzten X Tagen vorkamen

Rolle78HH

Benutzer
Beiträge
5
Hallo zusammen,

aus einer Logging Datenbank möchte ich einen Bericht erzeugen der mir anzeigt welche Rechner in den letzten X Tagen, täglich Fehler hatten. Die Fehler der letzten 24 Stunden lese ich wie folgt aus:

SELECT [Msg_Nr], [Msg_Time], [Msg_Client_TXT], [Msg_TXT]
FROM [DATABASE].[dbo].[tbl_MMC]
WHERE [Msg_Nr] = 666 AND [Msg_TXT] = 'Fehlertext' AND [Msg_Time] >= DATEADD(day, -1, ETDATE())
ORDER BY [Msg_Time] DESC

Das Ergebnis ist eine Liste diverser Rechner die einen Fehler erzeugt haben, ich möchte die Abfrage jetzt so erweitern das nur Rechner ausgegeben werden die in den letzten 5 Tagen, jeden Tag mindestens einen Fehler erzeugt haben.

Mir fehlt hier leider komplett eine Idee oder ein Ansatz dazu, könnt Ihr mir diesbezüglich auf die Sprünge helfen?

Schon vorab vielen Dank für eure Mühe!
Rolf
 
Werbung:
Code:
test=*# select * from log;
 rechner |  datum   
---------+------------
  1 | 2017-01-14
  1 | 2017-01-15
  1 | 2017-01-16
  1 | 2017-01-17
  1 | 2017-01-18
  1 | 2017-01-19
  2 | 2017-01-19
  2 | 2017-01-16
  2 | 2017-01-14
  3 | 2017-01-14
  3 | 2017-01-16
  3 | 2017-01-17
  3 | 2017-01-18
(13 Zeilen)

test=*# select rechner, count(distinct datum) as anzahl from log where datum between current_date - 5 and current_date group by rechner having count(distinct datum) > 5;
 rechner | anzahl
---------+--------
  1 |  6
(1 Zeile)

Sollte M$SQL auch können.
 
Etwa so:
Code:
SELECT [Msg_Nr], [Msg_Time], [Msg_Client_TXT], [Msg_TXT]
FROM [DATABASE].[dbo].[tbl_MMC]
WHERE [Msg_Nr] = 666 AND [Msg_TXT] = 'Fehlertext' AND [Msg_Time] >= DATEADD(day, -5, ETDATE())
GROUP BY [Msg_Nr], [Msg_Time], [Msg_Client_TXT], [Msg_TXT]
HAVING count(DISTINCT cast(ETDATE AS DATE)) >= 5
ORDER BY [Msg_Time] DESC
Allerdings meckert er bei mir wegen dem ETDATE(), ist das ein Fehler?
 
Allerdings meckert er bei mir wegen dem ETDATE(), ist das ein Fehler?

Ja, mein Fehler - das muss GETDATE heißen, also der Name der Funktion, wie auch immer das per Copy & Paste verschwinden kann :)
Leider bekomme ich auch nach Korrektur keine Ergebnisse, es sei denn ich passe die Zeile:

Code:
HAVING count(DISTINCT cast(Msg_Time AS DATE)) >= 5

wie folgt aan

Code:
HAVING count(DISTINCT cast(Msg_Time AS DATE)) >= 1

Bei jeder anderen Zahl außer 1 am Ende bekomme ich keine Ergebnisse.
 
Achso ja das Zeitfeld muss natürlich erstmal aus der gruppierung raus:
Code:
SELECT [Msg_Nr], [Msg_Client_TXT], [Msg_TXT], min([Msg_Time]) AS [Msg_Time]
FROM [DATABASE].[dbo].[tbl_MMC]
WHERE [Msg_Nr] = 666 AND [Msg_TXT] = 'Fehlertext' AND [Msg_Time] >= DATEADD(day, -5, GETDATE())
GROUP BY [Msg_Nr], [Msg_Client_TXT], [Msg_TXT]
HAVING count(DISTINCT cast([Msg_Time] AS DATE)) >= 5
 
Hallo nochmal zusammen,

ich habe eine Folgefrage zur Lösung von akretschmer aus dem zweiten Post.
Mit dieser Abfrage finde ich ja Rechner die in den letzten 5 Tagen Fehler geworfen haben, allerdings nicht ob der Rechner auch wirklich jeden Tag einen Fehler geworfen hat, richtig?
Aufbauend auf der Vermutung wollte ich mehrere Zeitfenster in der SQL Abfrage abfragen und bin bei folgendem Versuch gelandet:

Code:
SELECT [Msg_Client_TXT], COUNT(DISTINCT [Msg_Time]) AS Anzahl
FROM [ASDM].[dbo].[tbl_MMC_Monitor_f4008766_4716_4a5a_b05b_d38a82453786]
WHERE [Msg_Nr] = 577
     AND [Msg_TXT] = 'WOL failed after 4 attempts'
     AND [Msg_Time] BETWEEN DATEADD(DAY, -1, GETDATE()) AND GETDATE()
     AND [Msg_Time] BETWEEN DATEADD(DAY, -2, GETDATE()) AND DATEADD(DAY, -1, GETDATE())
     AND [Msg_Time] BETWEEN DATEADD(DAY, -3, GETDATE()) AND DATEADD(DAY, -2, GETDATE())
     AND [Msg_Time] BETWEEN DATEADD(DAY, -4, GETDATE()) AND DATEADD(DAY, -3, GETDATE())
     AND [Msg_Time] BETWEEN DATEADD(DAY, -5, GETDATE()) AND DATEADD(DAY, -4, GETDATE())
GROUP BY [Msg_Client_TXT]
HAVING COUNT(DISTINCT [Msg_Time]) > 5
ORDER BY Anzahl DESC

Leider bekomme ich damit keine Ergebnisse obwohl es Rechner gibt die jeden Tag Fehler geschrieben haben.

Wenn Ihr mir diesbezüglich noch einmal auf die Sprünge helfen könntet wäre das sehr nett.

Viele Grüße
Rolf
 
ich habe eine Folgefrage zur Lösung von akretschmer aus dem zweiten Post.
Mit dieser Abfrage finde ich ja Rechner die in den letzten 5 Tagen Fehler geworfen haben, allerdings nicht ob der Rechner auch wirklich jeden Tag einen Fehler geworfen hat, richtig?

Falsch. Ich weiß jetzt nicht, ob M$SQL das count(distinct ...) kann, aber ich zähle die Anzahl der unterschiedlichen Datumswerte. Und wenn zwischen N Tagen N unterschiedliche Datumswerte sind dann hast Du für die Zeitspanne je Tag ein Datum.
 
Werbung:
count(DISTINCT spalte) geht und tut bei einem Zeitraum genau das was es soll. Allerdings ist auch deine WHERE-Bedingung unerfüllbar, ein Zeitwert kann nicht gleichzeitig zwischen Jetzt und Jetz -1 Tag sowie zwischen Jetzt -1 Tag und Jetzt -2 Tage liegen, das geht schonmal rein logisch nicht. Wenn du mit OR arbeitest geht die WHERE-Bedingung, aber das mit dem count(DISTINCT spalte) wird dann komplexer, dann betrachtet er ja immer alle eindeutigen Werte aus mehreren Zeiträumen gleichzeitig. Das müsste man dann umgestalten damit es Sinn ergibt.
 
Zurück
Oben