これは、MySQLで変数(または非常に複雑な相関サブクエリ)を使用して行うことができます。他のデータベースでは、ウィンドウ/分析関数を使用します。
ロジックは次のとおりです。
- 月に1行、購入者を取得します。
- 変数を使用して、連続する月の各グループに「グループ化」値を割り当てます。
- 人と「グループ化」の値で集計します。
SQLフィドルでテストされたクエリは次のとおりです。
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;