2012-10-10 6 views
5

に応じて、他のデータと一緒に、私はSQLでテーブルを持って、表には、このようなものです:SQL、タイムスタンプ

+-------------+---------------+-------------------------+ 
| quotes_user | email_address | ________Sent_at________ | 
+-------------+---------------+-------------------------+ 
| user1  | email1  | 2012-10-09 12:23:53.253 | 
| user1  | email2  | 2012-10-09 12:24:53.253 | 
| user2  | email3  | 2012-10-09 13:20:53.253 | 
| user2  | email4  | 2012-10-09 11:23:53.253 | 
| user3  | email5  | 2012-10-08 10:29:53.253 | 
| user3  | email6  | 2012-10-08 14:23:53.253 | 
+-------------+---------------+-------------------------+ 

私は結果が

+-------------+---------------+-------------------------+ 
| quotes_user | email_address | ________Sent_at________ | 
+-------------+---------------+-------------------------+ 
| user1  | email2  | 2012-10-09 12:24:53.253 | 
| user2  | email3  | 2012-10-09 13:20:53.253 | 
| user3  | email6  | 2012-10-08 14:23:53.253 | 
+-------------+---------------+-------------------------+ 
を表示したいです

つまり、[一意のユーザーの一覧]とそのユーザーに関連付けられている最新の電子メールアドレスを選択します。

問題を説明する別の方法は、集計関数またはorder by節に含まれていないフィールドを選択することです。私はDistinctとOrder By、Group Byなどの順列をたくさん使って多くのステートメントを試してみました。

私は複数のステートメントを避けようとしています。

これで私を助けてください。

答えて

1

このお試しください:最後に送信されたメールの最大のsent_at correpondsを想定

SELECT t2.quotes_user, t2.email_address, t2.Sent_at AS '________Sent_at________' 
FROM 
(
    SELECT quotes_user, MAX(Sent_at) AS MaxDate 
    FROM Table 
    GROUP BY quotes_user 
) t1 
INNER JOIN Table t2 ON t1.quotes_user = t2.quotes_user 
        AND t1.Sent_at = t2.MaxDate 
+1

魅力的な作品です。 JOINの仕組みは分かりませんが、私を良いリソースに導くことができますか? –

+1

@SunnyRGupta - [ウィキペディア - SQLジョイン](http://en.wikipedia.org/wiki/Join_%28SQL%29)、[コーディングホラーのSQL結合のビジュアル説明 - ](http: /www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)、[Codeproject - SQL結合のビジュアル表現](http://www.codeproject.com/Articles/ 33052/SQLのビジュアル表現 - 結合)。さらに、SQL問合せの基本については、[SQL問合せ(Mere Mortals)](http://rads.stackoverflow.com/amzn/click/0201433362)を強くお薦めします。 –

+1

ありがとう、最後のリンクは非常に貴重です:D –

7

クエリの考え方は、サブクエリ内の各quotes_userに対して最大でSent_ATを取得し、元のテーブルに戻すことです。

SELECT a.* 
FROM tableName a INNER JOIN 
     (
      SELECT quotes_user, MAX(Sent_AT) maxSENT 
      FROM tableName 
      Group By quotes_user 
     ) b on a.quotes_user = b.quotes_user AND 
       a.Sent_AT = b.maxSent 

SQLFiddle Demo

+0

問題が解決しましたか?あなたは何をもっと知りたいですか? –

0
select quotes_user, email_address, sent_at 
from table_name t1 inner join 
    (select quote_user, max(sent_at) as sent 
    from table_name group by quotes_uaser) t2 
on t1.quotes_user = t2.quotes_user and t1.sent_at = t2.sent 
+1

@マフムードと同じ答えです。重複した回答は避けてください。 –

0
select quote_user, email_adress, max(___sent_at___) from users group by quote_user 

を。

+1

エラー: カラム 'email_adress'は、集計関数またはGROUP BY句に含まれていないため、選択リストでは無効です。 –

+0

申し訳ありませんが、 'group by quote_user、email_adress'のgroup by句を変更すると効果があります。 –

+1

動作しますが、目的の出力が得られません。実際、これは私が自分自身を試した最初のコードでした。うまくいきませんでしたので、もう少し試してみてください。 –

関連する問題