Bạn có thể thực hiện điều này trong MySQL bằng cách sử dụng các biến (hoặc các truy vấn con tương quan rất phức tạp). Trong các cơ sở dữ liệu khác, bạn sẽ sử dụng các hàm cửa sổ / phân tích.
Logic là:
- Nhận một hàng mỗi tháng và một người mua hàng.
- Sử dụng các biến để gán cho mỗi nhóm các tháng liên tiếp một giá trị "phân nhóm".
- Tổng hợp theo người và giá trị "nhóm".
Đây là một truy vấn đã được kiểm tra trên SQL Fiddle của bạn:
select person, count(*) as numMonths
from (select person, ym, @ym, @person,
if(@person = person and @ym = ym - 1, @grp, @grp := @grp + 1) as grp,
@person := person,
@ym := ym
from (select distinct person, year(purdate)*12+month(purdate) as ym
from records r
) r cross join
(select @person := '', @ym := 0, @grp := 0) const
order by 1, 2
) pym
group by person, grp;