当前位置: 首页 > 面试题库 >

MySQL:连续几个月的记录数

杨无尘
2023-03-14
问题内容

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

我有一个包含以下字段的表格:人,事物,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')
;

问题答案:

您可以在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 5中有一个电话号码表。简单的结构是 记录如下 我需要对这些数据进行排序,并将连续的数字块分组为数字范围。我愿意在C#LINQ中实现该解决方案,但服务器端MySql是一等奖。MySql中是否有一种方法可以汇总此数据,以便输出如下所示? 问题答案: 有一个简单的技巧可以将连续的条目折叠成一个组。如果按(row_number-entry)进行分组,则连续的条目将在同一组中结束

  • 问题内容: 您好,我正在使用此sql查询来获取基于月份的图表表示形式的最近12个月的记录: 但是,如果一个月没有任何记录,则它不会按预期包含在结果集中,并且我正在使用php进行大量计算以完成所需的操作。 我的问题是:是否有一种方法可以检索一个简单的结果集,其中包含过去12个月每个月的驱动器总数,并且如果一个月中有0个驱动器,则还必须将其包含在结果集中显示。 问题答案: 您需要使用一个表进行外部联接

  • 问题内容: 我正在尝试计算表中的记录,并按日期将它们分组。我当前的查询如下所示: 这行得通,除了我还要数月不存在任何记录的计数。 谁能提供有关如何实现此目标的建议/建议? 问题答案: 在MySQL中执行此操作的最简单方法是创建一个名为的表,该表列出了您感兴趣的所有月份,并在表中使用LEFT JOIN。 但是,由于这主要是一个表示问题,因此通常很容易在您已经在运行的情况下运行查询并在客户端(例如PH

  • 问题内容: 表名称调用 上面是一个示例,我需要找出的是如何找到连续无应答计数大于6的数字? 目前,我已经能够获得以下信息,但它不是连续的。 问题答案: 您可以使用变量来执行此操作。 该查询使用4个变量 1)@cur_outcome,它最初设置为空字符串。此后,选择将分配当前行的system_outcome。 2)@prev_outcome,最初设置为空字符串。此后,选择将其设置为@cur_outc

  • 问题内容: 我有一个带有时间戳字段的表。如何获得最近3个月的数据? 特别是,三月是我当前的月份,请说 03/2012 。我只需要返回3月,2月和1月的记录。 问题答案: 今天前3个月: 从第一个月开始:

  • 问题内容: 我有一个具有“约会表”和“服务表”的数据库。每个appt都有一个服务,每个服务都有一个价格。我想要的是一个查询,该查询将始终返回12行(每月一行),并包含几个月的总和(基于其服务ID)。到目前为止,我有: 当前,返回的内容如下: 问题是,如果一个月没有任何订单,我不会在查询中返回该月。我希望该月有一个记录,只是它的“ monthly_total”等于零。 以下是我希望查询返回的内容: