fabmin
Goto Top

MSSQL - GROUP BY Problem

Hallo Zusammen,

ich habe folgendes Problem. Mein Query

SELECT asset.objectID
, acb.AccountName
, MAX(llo.logondate)

FROM [dbo].[SPSComputerClassLogon] llo
INNER JOIN SPSAccountClassBase acb ON acb.id = llo.LoggedAccount
INNER JOIN SPSComputerClassBase comp ON llo.[Expression-ObjectID] = comp.[Expression-ObjectID]
INNER JOIN SPSAssetClassBase asset ON comp.[Expression-ObjectID] = asset.[Expression-ObjectID]

GROUP BY asset.objectid, acb.AccountName
ORDER BY asset.objectid
liefert folgende Liste

objectID AccountName (Kein Spaltenname)
CMP00001 PN00005 2011-01-28 08:12:12.000
CMP00002 PN00005 2011-01-27 06:37:19.000
CMP00003 PN00007 2011-01-26 15:50:44.000
CMP00003 PN00010 2011-01-28 14:11:09.000
CMP00003 PN00009 2011-01-27 15:02:05.000
CMP00004 PN00005 2011-01-19 13:42:10.000
CMP00005 PN00007 2011-01-27 06:58:46.000
CMP00006 PN00002 2011-01-28 08:09:45.000
Ich möchte allerdings erreichen, dass unter der ObjectID (CMP0000X) nur ein AccountName (PN0000X) angezeigt wird und zwar der mit den häufigsten LogOnDate (llo.logondate) der letzten 90Tage. Sollte das nicht möglich sein, dann der AccountName mit dem aktuellste Datum.

Kann mir da vielleicht jemand helfen?


Vielen Dank vorab und Grüße

Fabian

Content-ID: 159936

Url: https://administrator.de/forum/mssql-group-by-problem-159936.html

Ausgedruckt am: 22.12.2024 um 10:12 Uhr

nxclass
nxclass 02.02.2011 um 11:02:48 Uhr
Goto Top
dass unter der ObjectID (CMP0000X) nur ein AccountName (PN0000X)
zwar der mit den häufigsten LogOnDate (llo.logondate)
der letzten 90Tage
SELECT ... COUNT( asset.objectid ) oder meinst Du mit dem letzten LogOnDate ?
...
WHERE llo.logondate > '2011-01-01' - oder eine Berechnung von NOW() - 90 Tagen
GROUP BY acb.AccountName
...
ORDER BY COUNT( asset.objectid ) DESC
LIMIT 1;

ich kenne nur die Funktionen von MySQL - daher kann ich nicht weiter ins Detail gehen.

EDIT:
oder GROUP BY so belassen und auf Limit verzichten - bin mir nicht sicher was Du als Ergebnis willst.
FaBMiN
FaBMiN 02.02.2011 um 11:16:28 Uhr
Goto Top
Hi,
zunächst vielen Dank für die Mühe =)

die Liste besteht aus Computernamen, AD-Accounts und einem Anmeldedatum. Es werden hier alle jemals angemeldeten AD-Accounts pro Computer mit einem Anmeldedatum gelistet.
Ich möchte aus dieser Liste den am häufigsten aufgeführten AD-Account pro Computer
oder den AD-Account pro Computer mit dem aktuellsten Datum

THX!
MadMax
MadMax 02.02.2011 um 12:39:53 Uhr
Goto Top
Hallo Fabian,

probier es mal damit:
select	objectID, AccountName, logondate
from	(
	SELECT asset.objectID
	, acb.AccountName
	, MAX(llo.logondate) as logondate,
	row_number() over (partition by asset.objectID order by sum (case when datediff (d, llo.logondate, getdate()) <= 90 then 1 else 0 end) desc, max (llo.logondate) desc) as zeile
	FROM [dbo].[SPSComputerClassLogon] llo
	INNER JOIN SPSAccountClassBase acb ON acb.id = llo.LoggedAccount
	INNER JOIN SPSComputerClassBase comp ON llo.[Expression-ObjectID] = comp.[Expression-ObjectID]
	INNER JOIN SPSAssetClassBase asset ON comp.[Expression-ObjectID] = asset.[Expression-ObjectID]
	GROUP BY asset.objectid, acb.AccountName) as tmp
where	zeile = 1
ORDER BY objectid

Mit dem row_number erzeugst Du Dir die Sortierung, wie Du sie benötigst und nimmst dann immer den ersten Datensatz.

Gruß, Mad Max