Wie gruppiert man Zeilen nach DATEDIFF?

9

Ich hoffe, du kannst mir helfen.

Ich muss die Datensätze in der Tabelle HH_Solution_Audit anzeigen - wenn zwei oder mehr Mitarbeiter den Raum innerhalb von 10 Minuten betreten. Hier sind die Anforderungen:

  1. Zeigt nur die Ereignisse mit einem Zeitstempelintervall (LAST_UPDATED) von weniger als oder gleich 10 Minuten an. Daher muss ich die aktuelle Zeile mit der nächsten Zeile und der vorherigen Zeile vergleichen, um zu überprüfen, ob ihr DATEDIFF kleiner oder gleich 10 Minuten ist. Ich bin fertig mit diesem Teil.
  2. Nur die Datensätze anzeigen, wenn die Anzahl der eindeutigen STAFF_GUID innerhalb des Raums für weniger als oder gleich 10 Minuten mindestens 2 beträgt.

HH_Solution_Audit Tabellendetails:

  1. ID - PK
  2. STAFF_GUID - Mitarbeiter-ID
  3. LAST_UPDATED - Datum, wann ein Mitarbeiter einen Raum betritt

Folgendes habe ich bis jetzt bekommen. Dies erfüllt nur die Anforderung Nr. 1.

%Vor% %Vor%

Beim Ausführen der Abfrage werden IDs zurückgegeben:
1, 2, 3, 5, 6, 7, 10, 11, 12, 13, 14
Dies erfüllt die Anforderung Nr. 1 mit einem Intervall von weniger als oder gleich 10 Minuten zwischen der vorherigen Zeile, der aktuellen Zeile und der nächsten Zeile.

Können Sie mir bei der 2. Anforderung helfen? Wenn es angewendet wird, sollten die zurückgegebenen IDs nur lauten:
13, 14

    
Raii 14.08.2013, 13:42
quelle

1 Antwort

3

Hier ist eine Idee. Sie benötigen ROW_NUMBER und vorherige und nächste Datensätze nicht. Sie müssen nur unioned abfragen - einer sucht nach jedem, der X Minuten hinter sich hat, und einem anderen, der X Minuten im Voraus sucht. Jeder verwendet eine korrelierte Unterabfrage und COUNT (*), um die Anzahl der übereinstimmenden Personen zu finden. Wenn die Anzahl größer ist als deine @numOfPersonen - das war's.

BEARBEITEN: neue Version: Statt zwei Abfragen mit 10 Minuten im Voraus und hinterher zu machen, werden wir nur nach 10 Minuten nachsehen - diejenigen auswählen, die in cteLastOnes übereinstimmen. Danach wird in einem anderen Teil der Abfrage nach denen suchen, die tatsächlich innerhalb dieser 10 Minuten existieren. Letztlich wieder die Vereinigung von ihnen und den "Letzten"

%Vor%

SQLFiddle DEMO - neue Version

SQLFiddle DEMO - alte Version

    
Nenad Zivkovic 14.08.2013, 15:07
quelle