MySQL:连续月份的记录数

标签 mysql sql mysql-variables

我已经四处搜索了这个,但所有类似的问题和答案都完全不同,无法正常工作。

我有一个包含以下字段的表:person、thing、purdate。当一个人购买每件新东西时,就会进入一个新记录。

我想计算一个人购买任何“东西”(thing01 或 thing02,无关紧要)的连续月份。如果连续的星期天有间断,则应重新开始计数。

在附上数据后,我想以这样的方式结束:

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

我知道我可以获得一个不同的人员列表,extract(year_month from purdate) -- 我已经在这个 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')
;

最佳答案

您可以在 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;

关于MySQL:连续月份的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23205281/

相关文章:

PHP mysql 在两个表中搜索一个值然后将其合并

MySQL 复杂子查询公式

mysql - mysql分区是什么时候创建的?

mysql - 首选表结构

sql - 将成人数据集从文件加载到数据库

sql - SQL Server 窗口函数子句中的条件排序顺序

mysql - 如何计算内部连接表中的行数

mysql - 无法在 MySQL 上设置全局变量

mysql - 按分数对 mysql 中的用户进行排名

php - 访问 php/mysql 查询的结果