Mình có table orders, có company_id, user_id, created_at, hãy lấy ra người đã order nhiều món hàng nhất trong 5 ngày gần đây của mỗi công ty?
Mình có table orders, có company_id, user_id, created_at, hãy lấy ra người đã order nhiều món hàng nhất trong 5 ngày gần đây của mỗi công ty? Cảm ơn ạ !
1 CÂU TRẢ LỜI
Bạn có thể sử dụng câu query như sau: SELECT COUNT(), user_id FROM orders group by user_id WHERE thời gian hiện tại ( now() ) - created_at < 5 ngày AND company_id = ? ORDER BY COUNT() DESC
câu query này sẽ trả ra số đơn hàng user này có, user_id theo câu điều kiện như bạn muốn, bạn sắp xếp giảm dần và lấy record đầu tiên thì sẽ được như yêu cầu nhé
Ví dụ ở đây có 5 công ty, và mỗi cty có nhiều nhân viên order , thì yêu cầu ở đây cần lấy ra users có số lượng order nhiều nhất của mỗi cty, thì cần lấy ra 5 user có số lượng order nhiều nhất của mỗi cty.
with t_1 as(
select user_id, count(user_id) as order_count, company_id
from order_group
where DATEDIFF(day, GETDATE(), order_group.created_at) < 5
group by user_id, company_id
), t_2 as (
select *, RANK() OVER (PARTITION BY t_1.company_id ORDER BY t_1.order_count) as ranking
from t_1
) select * from t_2
WHERE ranking <= 5
order by company_id, ranking;
Cái này mình code bằng ms sql. Nếu mà nhiều ngươif cùng số order thì sẽ cùng rank, ví dụ 3 người cùng xếp thứ 4 thì sẽ hiện cả 3 ngưòi đó.
Mình mới nghĩ ra được câu truy vấn : select * from ( select *, RANK() over (PARTITION BY company_id order by countUser desc) as rank_no from ( select *, count(user_id) as countUser from orders where created_at between SUBDATE(CURDATE(), INTERVAL 5 DAY) AND CURDATE() group by company_id, user_id order by countUser desc ) as datasource ) as test where rank_no = 1 ;