Sie können dies in MySQL mithilfe von Variablen (oder sehr komplizierten korrelierten Unterabfragen) tun. In anderen Datenbanken würden Sie Fenster-/Analysefunktionen verwenden.
Die Logik ist:
- Erhalten Sie eine Zeile pro Monat und Person mit einem Kauf.
- Verwenden Sie Variablen, um jeder Gruppe aufeinanderfolgender Monate einen "Gruppierungs"-Wert zuzuweisen.
- Aggregiert nach der Person und dem "Gruppierungs"-Wert.
Hier ist eine Abfrage, die auf Ihrem SQL Fiddle getestet wurde:
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;