Wie gruppiere ich Datensätze mit einer Zeitdifferenz von mehr als einer Stunde?

8

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.

    
Jefferson 28.04.2012, 14:26
quelle

4 Antworten

3

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%     
marc_s 28.04.2012, 14:46
quelle
2

Wenn Sie auf SQL Server 2012 aktualisiert haben, können Sie hierfür LAG verwenden.

%Vor%

SQL Fiddle hier .

    
Steve Kass 29.04.2012 00:24
quelle
1

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.

    
Bogdan Sahlean 28.04.2012 17:37
quelle
0

CTEs zur Anzeige aller Computer mit mindestens einem Besuch oder Besuche vor und nach Lücken & gt; 60 Minuten.

%Vor%

Ergebnis:

    
John Dewey 28.04.2012 15:28
quelle

Tags und Links