mysql - 连续 4 年购买历史识别
问题描述
我试图找出连续 4 年购物的客户。
该表将有四列
- 日期
- 物品
- id(通用序列号)
- 名称(可以将其视为客户的唯一 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 年购买的购买
预期输出为
任何线索将不胜感激。
解决方案
一种方法是按客户和年份汇总,然后使用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,那么您连续四年。
推荐阅读
- javascript - 在反应的功能组件中实现 onKeyPress
- amazon-ec2 - 将快照包含在根目录上的多个 ebs 卷合并为一个
- node.js - SQL Server:无法通过 ODBC 驱动程序连接
- c++ - Scanf 从标准输入浮动,由字符“e”分隔
- javascript - 如何为 Imagus 悬停缩放扩展制作自定义筛子/过滤器?
- apache-spark - Apache Spark:在 parquet 文件中包含分区列
- c# - 从普通用户角色启动和停止 Windows 服务
- mysql - MySQL 语法检查
- reactjs - React — 简化数据存储而不是 Redux,优缺点是什么?
- go - 谷歌可以使用 Go 数据存储层次结构树过滤子级