Nếu bạn muốn tỷ lệ người dùng đã thanh toán cho những người có hoạt động, chỉ cần tóm tắt từng bảng riêng lẻ:
select p.cnt / a.cnt
from (select count(distinct user_id) as cnt from activity a) a cross join
(select count(distinct user_id) as cnt from payment) p;
CHỈNH SỬA:
Bạn cần một bảng với tất cả các ngày trong phạm vi. Đó là vấn đề lớn nhất.
Sau đó, tôi muốn giới thiệu:
SELECT d.dte,
( ( SELECT COUNT(DISTINCT p.user_id)
FROM payments p
WHERE p.payment_date >= d.dte and p.payment_date < d.dte + INTERVAL 1 DAY
) /
NULLIF( (SELECT COUNT(DISTINCT a.user_id)
FROM activity a
WHERE a.login_time >= d.dte and p.login_time < d.dte + INTERVAL 1 DAY
), 0
) as ratio
FROM (SELECT date('2017-01-01') dte UNION ALL
SELECT date('2017-01-02') dte UNION ALL
SELECT date('2017-01-03') dte UNION ALL
SELECT date('2017-01-04') dte UNION ALL
SELECT date('2017-01-05') dte
) d;
Ghi chú:
- Điều này trả về
NULL
vào những ngày không có hoạt động. Điều đó có ý nghĩa với tôi hơn0
. - Điều này sử dụng logic về ngày tháng hoạt động cho cả ngày tháng và giá trị ngày / giờ.
- Logic cho ngày tháng có thể sử dụng một chỉ mục, chỉ mục này có thể quan trọng đối với loại truy vấn này.
- Tôi không khuyên bạn nên sử dụng
LEFT JOIN
S. Điều đó sẽ nhân dữ liệu và có thể khiến truy vấn trở nên đắt đỏ.