首页 > 解决方案 > 连续 4 年购买历史识别

问题描述

我试图找出连续 4 年购物的客户。

该表将有四列

  1. 日期
  2. 物品
  3. id(通用序列号)
  4. 名称(可以将其视为客户的唯一 ID)

样本数据如下,

在此处输入图像描述

我已经通过使用领先和滞后功能的组合来确定连续购买,但是在我确定连续购买之后,我如何确定 4 年的连续购买。

sql

select
  a.*
)
from
  (
    select
      *,
      case
        WHEN (
          DATE_ADD(
            lag(year, 1, '1900-01-01') over (
              partition by name
              order by
                id asc
            ),
            INTERVAL 12 YEAR_MONTH
          ) = year
          or DATE_ADD(
            lead(year, 1, '1900-01-01') over (
              partition by name
              order by
                id asc
            ),
            INTERVAL -12 YEAR_MONTH
          ) = year
        ) then 1
        else 0
      end as match_col
    from
      inventory
  ) a
  where a.match_col = 1
  
  order by id

样本输出

在此处输入图像描述

我如何为名为“amith”的客户提取记录 4、5、6、7(2011 - 2014),跳过其他购买。这些是唯一连续 4 年购买的购买

预期输出为

在此处输入图像描述

任何线索将不胜感激。

标签: mysqlsql

解决方案


一种方法是按客户和年份汇总,然后使用lag()

select name, yyy
from (select i.name, year(i.date) as yyyy,
             lag(year(i.date, 3)) over (partition by i.name order by year(i.date)) as yyyy_3
      from inventory i
      group by i.name, year(i.date)
     ) ny
where yyyy_3 = yyyy - 3;

也就是说,为每个名称和年份生成一个唯一的行。然后顶峰返回三排。如果该行是当前年份减去 3,那么您连续四年。


推荐阅读