2009-06-02 37 views
5

Tôi có một truy vấn mà hiện một số lượng tham gia và có một vài tiêu chí trong mệnh đề WHERE, và tôi kết thúc với một kết quả mà chủ yếu trông như thế này:nhóm SQL bởi sự cố

| userId |  date | otherData | 
|--------+------------+------------| 
|  1 | 2008-01-01 | different | 
|  1 | 2009-01-01 |  info | 
|  1 | 2010-01-01 |  for | 
|  2 | 2008-01-01 |  each | 
|  3 | 2008-01-01 |  row | 
|  3 | 2009-01-01 |  here | 

Vì vậy, , về bản chất cho mỗi người dùng, sẽ có một hoặc nhiều ngày trong quá khứ và 0 ngày trở lên trong tương lai.

Tôi cần bằng cách nào đó giảm tập dữ liệu xuống một hàng cho mỗi người dùng, chỉ chọn hàng có ngày được truyền gần đây nhất. Nghĩa là, với bất cứ điều gì kỳ diệu GROUP BY hoặc HAVING khoản được thêm vào, kết quả từ ở trên sẽ giống như thế này:

| userId |  date | otherData | 
|--------+------------+------------| 
|  1 | 2009-01-01 |  info | 
|  2 | 2008-01-01 |  each | 
|  3 | 2009-01-01 |  here | 

Trả lời

5

Tôi nghĩ rằng bạn không muốn sử dụng GROUP BY/HAVING vì bạn quan tâm đến chính xác 1 hàng cho mỗi người dùng và hàng đó đã tồn tại trong bảng dưới dạng. Điều này đòi hỏi một mệnh đề WHERE chứ không phải GROUP BY/HAVING.

Đề xuất của tôi là trong mệnh đề WHERE, bạn thêm điều kiện là ngày phải bằng kết quả của truy vấn phụ. subquery đó nên:

  1. Chọn tối đa (ngày)
  2. Có một mệnh đề WHERE giới hạn ngày phải nhỏ hơn VỚI DOANH NGHIỆP
  3. Có một mệnh đề WHERE với UserID bằng user id bên ngoài truy vấn của

Để ngăn chặn các trường hợp một người dùng nhất định có thể có hai mục nhập với cùng một ngày cũng là ngày "vượt qua" tối đa, bạn cũng nên thêm DISTINCT.

Hy vọng điều đó sẽ hữu ích.

+0

hoạt động tốt !! nhưng thêm DISTINCT không loại bỏ các giá trị trùng lặp, bất kỳ đề xuất nào? – Rakesh

0

Như thế này:

select a.userId, a.date, b.userId, b.otherData 
from table1 as a 
left outer join table2 as b on a.userId = b.userId 
where b.Id in (
    select top 1 Id from table2 as c where c.userId = a.userId) 
0
 
Select 
    userID, date, otherData 
from 
    yourTable t1 
where 
    date = 
    (select max(date) from yourTable t2 
    where t1.userID=t2.userID) 
0
select T.userid, T.date, T.otherdata 
from 
    T, 
    (select userid, max(date) max_date from T group by userid) GT 
where 
    T.userid = GT.userid and T.date = GT.max_date 

Giải thích: Nội chọn - izolate chỉ các hồ sơ với ngày tối đa cho mỗi người dùng. toàn bộ lựa chọn - nối các bản ghi izolated với bảng gốc, để lấy trường dữ liệu khác.

Tôi giả định rằng chỉ có một ngày tối đa cho id người dùng. Hãy nói nếu đó là giả định chính xác.

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