zoukankan      html  css  js  c++  java
  • sql 查询至少连续n天下单的用户

    下图为一张订单表(order1),现希望查找出至少连续3天下单的用户。

    第一步:将订单表按UserId分组根据日期Date排序

    第二步:用日期Date减去对应的排序号Num,若日期是连续的,则相减的结果Datedif相等。

    第三步:按UserId,Datedif分组计数,得到各用户的连续下单天数。

    第四步:筛选连续下单天数≥n的用户

    # 订单表  order1
    # UserId  Date  Orders
    # step1: 将订单表按UserId分组根据日期Date排序
     SELECT UserId,`Date`,orders,
     row_number() over(PARTITION BY UserId ORDER BY DATE)Num
     FROM order1
     # step2: 用日期Date减去对应的排序号Num,若日期是连续的,则相减的结果Datedif相等。
     SELECT UserId,`Date`,`Date`-Num  AS DateDif
     FROM 
     (
     SELECT UserId,`Date`,orders,
     row_number() over(PARTITION BY UserId ORDER BY DATE)Num
     FROM order1
     )a
     # step3:按UserId,Datedif分组计数,得到各用户的连续下单天数。
     SELECT UserId,COUNT(1) AS Consecutive
     FROM (
      SELECT UserId,`Date`,`Date`-Num  AS DateDif
     FROM 
     (
     SELECT UserId,`Date`,orders,
     row_number() over(PARTITION BY UserId ORDER BY DATE)Num
     FROM order1
     )a
     )b
     GROUP BY UserId,DateDif
     # 筛选连续下单天数≥3的用户
     SELECT Userid
     FROM
     (
     SELECT UserId,COUNT(1) AS Consecutive
     FROM (
     SELECT UserId,`Date`,`Date`-Num  AS DateDif
     FROM 
     (
     SELECT UserId,`Date`,orders,
     row_number() over(PARTITION BY UserId ORDER BY DATE)Num
     FROM order1
     )a
     )b
     GROUP BY UserId,DateDif
     )c
     WHERE Consecutive>=3
    
  • 相关阅读:
    新思路:Exception Handle
    转战github了
    矩阵内积和Schur补
    原子范数及线谱估计
    次梯度方法
    机器学习——推荐系统
    机器学习——异常值检测
    机器学习——聚类分析和主成分分析
    常用不等式集锦
    机器学习——支持向量机(SVM)
  • 原文地址:https://www.cnblogs.com/alidata/p/13535139.html
Copyright © 2011-2022 走看看