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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 159936
Url: https://administrator.de/forum/mssql-group-by-problem-159936.html
Ausgedruckt am: 22.12.2024 um 10:12 Uhr
3 Kommentare
Neuester Kommentar
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 ?zwar der mit den häufigsten LogOnDate (llo.logondate)
der letzten 90Tage
...
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.
Hallo Fabian,
probier es mal damit:
Mit dem row_number erzeugst Du Dir die Sortierung, wie Du sie benötigst und nimmst dann immer den ersten Datensatz.
Gruß, Mad Max
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