2017-12-01 7 views
0

Ich versuche, eine Min- und Max-Zeitstempel einer einzelnen Sitzung ID zu ziehen, um einige Analysen zu machen. Was könnte bewirken, dass MIN- und MAX-Versionen derselben SQL-Abfrage eine (geringfügig) andere Ergebnismenge zurückgeben? Ich bin verwirrt, warum ich eine andere Anzahl von Ergebnissen bekomme. Die Datenbank wird nicht in Echtzeit aktualisiert. Hat jemand eine mögliche Erklärung?SQL Min und Max Rückgabe unterschiedlicher Ergebnismenge

SELECT [ActivityLogs].sessionid, 
     maxSelect.mxDate, 
     [ActivityLogs].ClientIp INTO ##maxSessionTimes 
FROM [OLBRET_COPY].[dbo].[ActivityLogs] 
INNER JOIN 
    (SELECT max([ActivityLogs].[DateTime]) mxDate, 
      SessionId 
    FROM [OLBRET_COPY].[dbo].[ActivityLogs] 
    GROUP BY SessionId) maxSelect ON [ActivityLogs].SessionId = maxSelect.SessionId 
AND [ActivityLogs].[DateTime] = maxSelect.mxDate 
WHERE [ActivityLogs].[DateTime] > '2017-11-29' 


SELECT [ActivityLogs].sessionid, 
     minSelect.mxDate, 
     [ActivityLogs].ClientIp INTO ##minSessionTimes 
FROM [OLBRET_COPY].[dbo].[ActivityLogs] 
INNER JOIN 
    (SELECT min([ActivityLogs].[DateTime]) mxDate, 
      SessionId 
    FROM [OLBRET_COPY].[dbo].[ActivityLogs] 
    GROUP BY SessionId) minSelect ON [ActivityLogs].SessionId = minSelect.SessionId 
AND [ActivityLogs].[DateTime] = minSelect.mxDate 
WHERE [ActivityLogs].[DateTime] > '2017-11-29' 
+0

Das Datum Teil der Verknüpfung ist, so beim Filtern auf 'max' vs' min 'Sie filtern nach verschiedenen Werten. Warum erwarten Sie dieselben Ergebnisse für verschiedene Abfragen? – JohnLBevan

+0

@JohnLBevan Ich weiß, meine erste Frage ist vielleicht nicht 100% klar. Ich bekomme eine andere Anzahl von Ergebnissen, was mir fremd ist. Das erwartete Verhalten ist, wenn die SessionID nur einmal erscheint, min und max die gleiche Datumszeit zurückgibt, und wenn es mehr als eine Instanz derselben SessionID gibt, dann sind min und max wahr min und max. Ich bin mir nicht sicher, was du meinst bezüglich des Datums, das Teil des Beitritts ist. Ich sehe nicht, wie sich das auf die Anzahl der Ergebnisse auswirkt. – christodorov

+0

Wir haben Ihre Daten nicht, aber im Allgemeinen ist es durchaus möglich, dass zwei Sätze von Zeilen das gleiche Mindestdatum, aber ein anderes maximales Datum haben oder umgekehrt. –

Antwort

0

Ich schlage vor, Sie min/max als Fensterfunktionen verwenden statt, so dass Sie eine einzelne Abfrage verwenden können:

SELECT 
     * 
FROM (
     SELECT 
       * 
      , MIN([DateTime]) over(partition by sessionid) minDateTime 
      , MAX([DateTime]) over(partition by sessionid) maxDateTime 
     FROM [OLBRET_COPY].[dbo].[ActivityLogs] 
     WHERE [ActivityLogs].[DateTime] > '2017-11-29' 
    ) d 
WHERE [DateTime] = minDateTime or [DateTime] = maxDateTime