2010-03-08 43 views
6

Tôi có hai bảng sau đây (với một số dữ liệu ngay mẫu)Merge truy vấn vào một truy vấn

GỖ:

 
ID | SETID | DATE 
======================== 
1 | 1 | 2010-02-25 
2 | 2 | 2010-02-25 
3 | 1 | 2010-02-26 
4 | 2 | 2010-02-26 
5 | 1 | 2010-02-27 
6 | 2 | 2010-02-27 
7 | 1 | 2010-02-28 
8 | 2 | 2010-02-28 
9 | 1 | 2010-03-01 

STATS:

 
ID | OBJECTID | FREQUENCY | STARTID | ENDID 
============================================= 
1 | 1  | 0.5  | 1 | 5 
2 | 2  | 0.6  | 1 | 5 
3 | 3  | 0.02 | 1 | 5 
4 | 4  | 0.6  | 2 | 6 
5 | 5  | 0.6  | 2 | 6 
6 | 6  | 0.4  | 2 | 6 
7 | 1  | 0.35 | 3 | 7 
8 | 2  | 0.6  | 3 | 7 
9 | 3  | 0.03 | 3 | 7 
10 | 4  | 0.6  | 4 | 8 
11 | 5  | 0.6  | 4 | 8 
7 | 1  | 0.45 | 5 | 9 
8 | 2  | 0.6  | 5 | 9 
9 | 3  | 0.02 | 5 | 9 

Mỗi ngày các bản ghi mới được phân tích trên khác nhau bộ đối tượng và được lưu trữ trong bảng LOGS. Trong số các quy trình khác, một số thống kê được tính toán trên các đối tượng có trong các bộ này và kết quả được lưu trữ trong bảng STATS. Các thống kê này được tính toán thông qua một số nhật ký (được xác định bởi các cột STARTID và ENDID).

Vì vậy, truy vấn SQL nào có thể cung cấp cho tôi số liệu thống kê được tính toán mới nhất cho tất cả các đối tượng có ngày đăng nhập tương ứng.
Trong ví dụ được đưa ra, các hàng kết quả sẽ là:

 
OBJECTID | SETID | FREQUENCY | STARTDATE | ENDDATE 
====================================================== 
    1  | 1 | 0.45 | 2010-02-27 | 2010-03-01 
    2  | 1 | 0.6 | 2010-02-27 | 2010-03-01 
    3  | 1 | 0.02 | 2010-02-27 | 2010-03-01 
    4  | 2 | 0.6 | 2010-02-26 | 2010-02-28 
    5  | 2 | 0.6 | 2010-02-26 | 2010-02-28 

Vì vậy, các số liệu thống kê mới nhất cho bộ 1 được tính toán với các bản ghi từ 27 tháng 2 đến ngày 1 tháng Ba, trong khi số liệu thống kê cho set 2 được tính từ ngày 26 tháng 2 tới feb 28. đối tượng 6 không nằm trong hàng kết quả vì không có chỉ số nào trong khoảng thời gian cuối cùng.

Điều cuối cùng, tôi sử dụng MySQL.

Bất kỳ ý tưởng nào?

+0

+1 cho câu hỏi được xây dựng rõ ràng với dữ liệu mẫu tốt. –

+0

Có phải 0,35 đối với đối tượng 4, 5 là lỗi đánh máy không? (nó phải là 0,6?) – Patrick

Trả lời

3

Truy vấn này có phù hợp với câu hỏi của bạn không?

SELECT objectid, l1.setid, frequency, l1.date as startdate, l2.date as enddate 
FROM `logs` l1 
INNER JOIN `stats` s ON (s.startid=l1.id) 
INNER JOIN `logs` l2 ON (l2.id=s.endid) 
INNER JOIN 
(
    SELECT setid, MAX(date) as date 
    FROM `logs` l 
    INNER JOIN `stats` s ON (s.startid=l.id) 
    GROUP BY setid 
) d ON (d.setid=l1.setid and d.date=l1.date) 
ORDER BY objectid 
+0

Điều này sẽ không trả về một hàng cho objectid 6, bởi vì không có đăng nhập với setid = 1 cho đối tượng đó – Andomar

+0

Nó không trả về objectid 6 được yêu cầu – Patrick

+0

Câu hỏi là mơ hồ hơn tôi nghĩ :) Làm thế nào bạn sẽ giải thích frequncy 0,35 cho đối tượng 5 trong kết quả ví dụ? – Andomar

1

Nếu không có mối quan hệ, bạn có thể sử dụng tính năng lọc tham gia. Ví dụ:

select stats.objectid 
,  stats.frequency 
,  startlog.setid 
,  startlog.date 
,  endlog.date 
from  stats 
join  logs startlog 
on  startlog.id = stats.startid 
join  logs endlog 
on  endlog.id = stats.endid 
join  (
     select objectid, max(endlog.date) as maxenddate 
     from  stats 
     join  logs endlog 
     on  endlog.id = stats.endid 
     group by objectid 
     ) filter 
on  stats.objectid = filter.objectid 
     and filter.maxenddate = endlog.date 
order by stats.objectid 

Kết quả ví dụ của bạn có vẻ hơi lệch, ví dụ không có hàng cho objectid 5 trong đó tần suất bằng 0,35.

+0

Bạn đang trả về objectid 6 những gì không được yêu cầu;) 'đối tượng 6 không nằm trong hàng kết quả vì không có chỉ số nào trong khoảng thời gian cuối cùng' – Patrick

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