PDA

View Full Version : SQL-Abfrage: Maximum einer Gruppe



Bitverdreher
24-10-13, 13:31
Hallo zusammen,

in bestimmten Zeitabständen ermittle ich die Anzahl angemeldeter User (bzw. die Anzahl aktiver Sitzungen):
WRKUSRJOB USER(*ALL) STATUS(*ACTIVE) OUTPUT(*PRINT) + JOBTYPE(*INTERACT) ASTLVL(*INTERMED)
Anschließend wird das Spoolfile über ein Programm in eine Datei geschrieben, die folgende Felder enthält: Datum, Uhrzeit, Username, Jobname, Jobnummer usw.

20131024 120000 USER1
20131024 120000 USER1
20131024 120000 USER1
20131024 120000 USER2
20131024 120000 USER3

20131024 120500 USER1
20131024 120500 USER1
20131024 120500 USER2
20131024 120500 USER3
20131024 120500 USER4

20131024 120500 USER2
20131024 120500 USER2
20131024 120500 USER4

Ziel ist eine Auswertung, bei der die maximale Anzahl an aktiven Usern pro Tag ausgegeben wird (pro Messung wird ein User nur einmal gezählt, egal wie viele aktive Jobs er hat).

Bezogen auf obige Daten:
20131024 4 (da um 12:05 Uhr die meisten User aktiv waren)
20131025 x
20131026 y
usw.

Wie kann man das mit einem SQL-Statement am elegantesten lösen?
vielen Dank für eure Hilfe.

andreaspr@aon.at
24-10-13, 13:49
Hallo,

Ich würde das ganze in mehre Subselects unterteilen.
So in etwa wie ...


select datum, max(anzahl) from (
select datum, time, count(*) anzahl from (
select distinct datum, time, user) t1
group by datum, time ) t2

(Ungetestet)

lg Andreas

B.Hauser
24-10-13, 14:07
Ich finde, dass CTEs (Common Table Expressions) leichter zu lesen sind, da sie vor dem eigentlichen SELECT-Statement angegeben werden und nicht ineinander verschachtelt sind (bzw. sein sollten):


With x as (Select Datum, Zeit, Count(Distinct Benutzer) Anzahl
From YourTable
Group By Datum, Zeit)
Select Datum, Max(Anzahl)
From x
Group By Datum;

Birgitta

Bitverdreher
05-11-13, 08:39
vielen Dank für die schnellen Antworten. Der Vorschlag von Birgitta ist genau das, was ich gesucht habe.