2017-12-01 8 views
0

いくつかの分析を行うために、単一のセッションIDの最小値と最大値のタイムスタンプを取得しようとしています。 同じSQLクエリのMINおよびMAXバージョンが(少し)異なる結果セットを返す原因は何ですか?なぜ結果が違うのか混乱しています。データベースはリアルタイムで更新されません。誰もが可能なexplenationを持っていますか?SQL最小値と最大値が異なる結果セットを返す

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

を日付が参加の一部であり、その分、 'VS' max'にフィルタリングするときあなたは異なる値でフィルタリングしています。さまざまなクエリで同じ結果が期待されるのはなぜですか? – JohnLBevan

+0

@JohnLBevan私は私の最初の質問が100%明確でないかもしれないことを認識しています。私は私には奇妙な結果の数が増えています。予想される動作は、SessionIDが1回だけ出現し、minとmaxが同じ日付時刻を返し、同じSessionIDの複数のインスタンスがある場合、minとmaxは真のminとmaxです。私は結合の一部である日付に関して何を意味するのか分かりません。私はそれが結果の数にどのように影響するのか分かりません。 – christodorov

+0

データはありませんが、一般的に、2つの行が同じ最小日付を持ち、異なる最大日付を持つ可能性があります。 –

答えて

0

私はあなたが単一のクエリを使用することができますので、代わりにウィンドウ関数として最小/最大を使用することをお勧め:

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 
関連する問題