2016-05-03 9 views
0

が想定どこにあるとき、私は自分を含めて2011-01-01と2011-02-01 の間でログをしたユーザーを取得する必要がありますSQLは - 日付は句

userid logdate  event 
0  2009-01-01 x 
1  2010-01-01 x 
1  2011-01-01 xy 
1  2011-01-05 xz 
2  2011-01-21 xx 
2  2011-01-22 xx 

私はこのデータを持っている最も古い日付を取得します。初めから最初のlogdate。

期待される結果

userid first_logdate  
1  2010-01-01 
2  2011-01-21 

現在のソリューション

SELECT user_id, first_logdate 
    FROM (
    SELECT user_id, logdate, MIN(logdate) AS first_logdate 
    FROM tablex 
    GROUP BY 1 
    ) 
    WHERE logdate BETWEEN '2011-01-01' AND '2011-02-01' 

データが大きい場合は、このクエリが最適化されていますか?

+0

はい。私には解決策があります。クエリが最適化されているかどうかはわかりません。 – arkisle

+1

実行計画を確認します。 –

答えて

0

使用Group ByMin集計

SELECT DISTINCT userid, 
       (SELECT Min(first_logdate) 
       FROM yourtable B 
       WHERE a.userid = b.userid) 
FROM yourtable A 
WHERE first_logdate BETWEEN '2011-01-01' AND '2011-02-01' 
+0

これは間違っています。 userid = 1のfirst_logdateについて2011-01-01を取得します。これは2010-01-01です。 – arkisle

+0

@arkisle - 今すぐチェック –

0

GROUP BYユーザーIDとその最初のログの日付として

SELECT userid, MIN(logdate) AS first_logdate 
FROM table 
WHERE logdate BETWEEN '2011-01-01' AND '2011-01-21' 
GROUP BY userid 
+0

これは間違っています。 userid = 1のfirst_logdateについて2011-01-01を取得します。これは2010-01-01です。 – arkisle

0

MIN日付を取得してみてください。

SELECT userid, MIN(logdate) AS first_logdate 
FROM table 
WHERE userid IN (
    SELECT userid FROM table 
    WHERE logdate BETWEEN '2011-01-01' AND '2011-01-21' 
) 
GROUP BY userid 

自己もよい参加使用される:

SELECT userid, MIN(t1.logdate) AS first_logdate 
FROM table t1 
JOIN table t2 USING (userid) 
WHERE t2.logdate BETWEEN '2011-01-01' AND '2011-01-21' 
GROUP BY userid 
EXISTSオペレータを用いた第3のバージョン

SELECT userid, MIN(logdate) AS first_logdate 
FROM table t1 
WHERE EXISTS (
    SELECT 555821 FROM table t2 
    WHERE t2.logdate BETWEEN '2011-01-01' AND '2011-01-21' 
     AND t1.userid = t2.userid 
) 
GROUP BY userid