小编典典

MySQL:连续几个月的记录数

sql

我已经搜索了此内容,但是所有类似的问题和答案都完全不同,无法正常工作。

我有一个包含以下字段的表格:人,事物,purdate。当某人购买每件新东西时,将输入一条新记录。

我想计算一个人连续购买了“事物”(thing01或thing02,没有关系)的月份。如果连续的休息日休息,则应重新开始计数。

封闭数据后,我想得出以下结论:

| Person     | Consec Days |
| person_01  | 3           |
| person_02  | 3           |
| person_02  | 2           |

我知道我可以得到一个不同的人员列表,extract(purdate的year_month)-我已经在此SQLFIDDLE中完成了,但是我不确定如何只计算连续记录并在中断处重新开始(例如在我的数据中,person_02在三月到五月之间中断。)

数据如下:

create table records (
  person varchar(32) not null,
  thing varchar(32) not null,
  purdate datetime not null
);

insert into records (person, thing, purdate) values
  ('person_01', 'thing01', '2014-01-02'),
  ('person_01', 'thing02', '2014-01-02'),
  ('person_01', 'thing02', '2014-02-27'),
  ('person_01', 'thing02', '2014-03-27'),
  ('person_02', 'thing02', '2014-01-28'),
  ('person_02', 'thing01', '2014-02-28'),
  ('person_02', 'thing02', '2014-03-28'),
  ('person_02', 'thing02', '2014-05-29'),
  ('person_02', 'thing02', '2014-06-29')
;

阅读 242

收藏
2021-03-23

共1个答案

小编典典

您可以在MySQL中使用变量(或非常复杂的相关子查询)来执行此操作。在其他数据库中,您将使用窗口/分析功能。

逻辑是:

  1. 每月购买一排,每人一次。
  2. 使用变量为连续几个月的每个组分配一个“分组”值。
  3. 按人和“分组”值进行汇总。

这是一个已经在您的SQL Fiddle上测试过的查询:

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;
2021-03-23