2012-10-10 10 views
5

Tôi có một bảng trong SQL, Bảng này là như thế này:SQL để chọn danh sách duy nhất của người sử dụng, cùng với các dữ liệu khác tùy thuộc vào timestamp

+-------------+---------------+-------------------------+ 
| 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 | 
+-------------+---------------+-------------------------+ 

Tôi muốn kết quả để hiển thị

+-------------+---------------+-------------------------+ 
| 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 | 
+-------------+---------------+-------------------------+ 

nghĩa là tôi muốn chọn Danh sách người dùng duy nhất và địa chỉ email mới nhất được liên kết với họ.

Một cách khác để giải thích sự cố là, rằng tôi muốn chọn một trường không được bao gồm trong bất kỳ hàm tổng hợp hoặc thứ tự nào theo mệnh đề. Tôi đã thử nhiều phát biểu với rất nhiều hoán vị của Phân biệt và Sắp xếp theo, Nhóm theo vv để không sử dụng.

Tôi đang cố gắng tránh nhiều câu lệnh.

Hãy giúp tôi với điều này.

Trả lời

1

Hãy thử điều này:

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

Làm việc như một sự quyến rũ. Mặc dù tôi không biết Phần JOIN hoạt động như thế nào, bạn có thể hướng dẫn tôi đến một nguồn tài nguyên tốt không? –

+1

@SunnyRGupta - Dưới đây là một số tài nguyên: [wikipedia - SQL Joins] (http://en.wikipedia.org/wiki/Join_%28SQL%29), [Coding horror Một giải thích trực quan về các kết nối SQL -] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html), [Codeproject - Visual đại diện của SQL Tham gia] (http://www.codeproject.com/Articles/ 33052/Visual-Representation-of-SQL-Joins). Hơn nữa, tôi rất khuyên bạn nên [Truy vấn SQL cho Mortals Mortals] (http://rads.stackoverflow.com/amzn/click/0201433362) cho các vấn đề cơ bản của truy vấn SQL. –

+1

Cảm ơn rất nhiều, liên kết cuối cùng cực kỳ có giá trị: D –

7

Ý tưởng đằng sau truy vấn là nhận được tối đa Sent_AT cho mỗi quotes_user bên trong truy vấn con và tham gia trở lại bảng gốc.

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

bất kỳ sự cố nào? bạn muốn biết gì hơn? –

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

Câu trả lời tương tự như vậy bởi @Mahmoud. Vui lòng tránh các câu trả lời trùng lặp. –

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

Giả sử các correponds sent_at lớn nhất với thư cuối cùng gửi.

+1

Cung cấp lỗi: Cột 'email_adress' không hợp lệ trong danh sách chọn vì nó không được chứa trong hàm tổng hợp hoặc mệnh đề GROUP BY. –

+0

Xin lỗi, việc thay đổi nhóm theo mệnh đề cho 'group by quote_user, email_adress' sẽ hoạt động. –

+1

Hoạt động, nhưng không đưa ra kết quả mong muốn. Trong thực tế, đây là mã đầu tiên tôi thử bản thân mình. Đã không hoạt động, do đó, được đăng ở đây sau một vài lần thử nữa. –

Các vấn đề liên quan