zoukankan      html  css  js  c++  java
  • 分享SQL,查询用户最近一次购买时间间隔

    (1)先创建一张测试表:

    1   CREATE TABLE `用户购买订单` (
    2 
    3   `购买时间` datetime(6) NULL DEFAULT NULL,
    4 
    5   `用户` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    6 
    7   `费用` decimal(20, 2) NULL DEFAULT NULL
    8 
    9   ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

    (2)往数据表填充数据:

     1   INSERT INTO `用户购买订单` VALUES ('2019-04-16 00:00:00.000000', '张三', 100.00);
     2 
     3   INSERT INTO `用户购买订单` VALUES ('2019-04-15 00:00:00.000000', '李四', 95.00);
     4 
     5   INSERT INTO `用户购买订单` VALUES ('2019-04-14 00:00:00.000000', '张A', 85.00);
     6 
     7   INSERT INTO `用户购买订单` VALUES ('2019-04-13 00:00:00.000000', '张B', 70.00);
     8 
     9   INSERT INTO `用户购买订单` VALUES ('2019-04-12 00:00:00.000000', '张C', 77.00);
    10 
    11   INSERT INTO `用户购买订单` VALUES ('2019-04-11 00:00:00.000000', '张D', 68.00);
    12 
    13   INSERT INTO `用户购买订单` VALUES ('2019-04-10 00:00:00.000000', '张E', 53.00);
    14 
    15   INSERT INTO `用户购买订单` VALUES ('2019-05-16 00:00:00.000000', '张三', 100.00);
    16 
    17   INSERT INTO `用户购买订单` VALUES ('2019-06-15 00:00:00.000000', '李四', 95.00);
    18 
    19   INSERT INTO `用户购买订单` VALUES ('2019-03-14 00:00:00.000000', '张A', 85.00);
    20 
    21   INSERT INTO `用户购买订单` VALUES ('2019-09-13 00:00:00.000000', '张B', 70.00);
    22 
    23   INSERT INTO `用户购买订单` VALUES ('2019-10-12 00:00:00.000000', '张C', 77.00);
    24 
    25   INSERT INTO `用户购买订单` VALUES ('2019-08-11 00:00:00.000000', '张D', 68.00);
    26 
    27   INSERT INTO `用户购买订单` VALUES ('2019-09-10 00:00:00.000000', '张E', 53.00);
    28 
    29   INSERT INTO `用户购买订单` VALUES ('2018-02-05 00:00:00.000000', '张三', 100.00);

    (3)实现思路:

      (3.1)首先做个合并表查询:

     1       SELECT
     2 
     3         用户购买订单.购买时间,用户购买订单.用户,a.购买时间 '购买时间1',a.用户 '用户1'
     4 
     5       FROM
     6 
     7         用户购买订单
     8 
     9       INNER JOIN
    10 
    11         (SELECT * from 用户购买订单)a
    12 
    13       ON
    14 
    15         用户购买订单.`用户` = a.`用户` AND 用户购买订单.购买时间 <> a.购买时间

    查询结果:

    ------------------------------------------------------------------------------------------------------------------

    (3.2)基于3.1求时间差:

     1     SELECT
     2 
     3       购买时间,用户,购买时间1,用户1,DATEDIFF(购买时间,购买时间1) as '购买日期间隔'
     4 
     5     FROM
     6 
     7       (SELECT
     8 
     9         用户购买订单.购买时间,用户购买订单.用户,a.购买时间 '购买时间1',a.用户 '用户1'
    10 
    11       FROM
    12 
    13         用户购买订单
    14 
    15       INNER JOIN
    16 
    17         (SELECT * from 用户购买订单)a
    18 
    19       ON
    20 
    21         用户购买订单.`用户` = a.`用户` AND 用户购买订单.购买时间 <> a.购买时间
    22 
    23       )b

    查询结果:

    ------------------------------------------------------------------------------------------------------------------

    (3.3)过滤掉"购买日期间隔"为负数的行:

     1     SELECT
     2 
     3        购买时间,用户,购买时间1,用户1,DATEDIFF(购买时间,购买时间1) as '购买日期间隔'
     4 
     5     FROM
     6 
     7         (SELECT
     8 
     9           用户购买订单.购买时间,用户购买订单.用户,a.购买时间 '购买时间1',a.用户 '用户1'
    10 
    11          FROM
    12 
    13           用户购买订单
    14 
    15         INNER JOIN
    16 
    17           (SELECT * from 用户购买订单)a
    18 
    19         ON
    20 
    21           用户购买订单.`用户` = a.`用户` AND 用户购买订单.购买时间 <> a.购买时间
    22 
    23         )b
    24 
    25     WHERE
    26 
    27         DATEDIFF(购买时间,购买时间1)>=0

    查询结果:

    ------------------------------------------------------------------------------------------------------------------

    (3.4)因为我们要求每个用户最近一次与上一次购买的时间间隔,所以,我们要基于上图对用户分组,去购买日期间隔最小值:

     1       SELECT
     2 
     3           用户,MIN(购买日期间隔) '距离上一次购买天数'
     4 
     5       FROM
     6 
     7         (
     8 
     9         SELECT
    10 
    11             购买时间,用户,购买时间1,用户1,DATEDIFF(购买时间,购买时间1) as '购买日期间隔'
    12 
    13         FROM
    14 
    15           (SELECT
    16 
    17             用户购买订单.购买时间,用户购买订单.用户,a.购买时间 '购买时间1',a.用户 '用户1'
    18 
    19           FROM
    20 
    21             用户购买订单
    22 
    23           INNER JOIN
    24 
    25             (SELECT * from 用户购买订单)a
    26 
    27           ON
    28 
    29             用户购买订单.`用户` = a.`用户` AND 用户购买订单.购买时间 <> a.购买时间
    30 
    31             )b
    32 
    33         WHERE
    34 
    35           DATEDIFF(购买时间,购买时间1)>=0
    36 
    37       )c
    38 
    39       GROUP BY
    40 
    41            用户

    查询结果:

  • 相关阅读:
    namespace
    kubernetes环境搭建
    verdaccio私有仓库搭建
    mysql中间件proxysql
    MySQL存储引擎
    关于分布式系统
    转载:ETL讲解
    用原生JS 写Web首页轮播图
    javascript——记忆小便签
    转载:JavaScript 的 this 原理
  • 原文地址:https://www.cnblogs.com/NBIDataVis/p/11156714.html
Copyright © 2011-2022 走看看