Ich bin neu auf dieser Seite, aber ertragen Sie mit mir.
Ich versuche GROUP BY
einige Daten mit SQL Server zu erstellen.
Hier sind die Daten:
%Vor%Was ich versuche zu erreichen ist, die Daten nach Computer zu gruppieren, aber auch zu gruppieren, wenn ein Computer zwischen einer Besuchszeit von mehr als einer Stunde unterscheidet. Hier ist das Ergebnis dessen, was ich versuche zu tun:
%Vor% So Computer A
wird zweimal angezeigt, weil es um 09:10:00 Uhr besucht und dann um 12:25:00 Uhr erneut besucht wurde, was einen Unterschied von über 1 Stunde bedeutet.
Es ist leicht zu "GROUP BY Computer", aber die andere, ich würde nicht wissen, wo ich anfangen soll. Jede Hilfe zu diesem Problem würde sehr geschätzt werden.
Das geht nicht mit einem einfachen GROUP BY
. Dieser Operator arbeitet nur an einzelnen Spalten - z.B. Sie könnten nach Computernamen oder etwas gruppieren, aber Sie können keine zusätzliche Logik hinzufügen, wie die Zeitdifferenz größer als eine Stunde sein muss oder etwas Ähnliches zur Gruppierung.
Was Sie tun können - vorausgesetzt, Sie befinden sich auf SQL Server 2005 oder neuer (Sie haben die Version in Ihrer Frage nicht erwähnt), würden CTEs (Common Table Expressions) verwendet werden. Diese bieten eine Möglichkeit, Ihre Daten zu löschen.
Hier mache ich mehrere Dinge - zuerst partitioniere ich die Daten nach ComputerName
und sortiere nach VisitDate
und benutze ROW_NUMBER()
, um eine fortlaufende Nummer für jede Partition zu erhalten. Dann bestimmt der zweite CTE den "ersten" Eintrag für jeden Computer - den mit der Zeilennummer = 1 - und der dritte CTE bestimmt schließlich die Differenz in VisitDate
für jeden Eintrag, verglichen mit dem Eintrag mit der Zeilennummer = 1. Daraus 3. CTE, schließlich wähle ich diejenigen Einträge, die entweder Zeilennummer = 1 (die erste für jede "Partition"), oder alles, was einen Unterschied in Minuten von 60 oder mehr hat.
Hier ist der Code:
%Vor%Wenn Sie auf SQL Server 2012 aktualisiert haben, können Sie hierfür LAG verwenden.
%Vor%SQL Fiddle hier .
Diese Lösung basiert auf einem rekursiven CTE. Sie können eine Online-Demo hier finden.
%Vor%Ergebnisse:
%Vor%Wenn Sie Fragen haben, zögern Sie nicht zu fragen.
CTEs zur Anzeige aller Computer mit mindestens einem Besuch oder Besuche vor und nach Lücken & gt; 60 Minuten.
%Vor%Ergebnis:
Tags und Links sql sql-server group-by