使用SQLite计算最近29天内新用户的订单总数

时间:2019-04-29 03:45:07

标签: sql sqlite

一个csv文件包含“ user_ids”和“ order_dates”。一个用户可能有多个订单日期,但不是同一天。确定新用户在使用产品的前29天内下达的订单总数。用户最早输入的订单=第1天。

ex:用户于2018年1月1日进行首次购买;截至2018年1月29日(含)之前下达的所有其他订单均计算在内此后的任何订单历史均不予考虑。

我使用了SQL提琴,并且在获得返回给我的订单计数方面取得了进展。但是,返回的结果仅限于要求的29天内。

具有between子句应将查询限制为在每个用户的前29天内报告销售情况,但事实并非如此。

CREATE TABLE mytable
  (
   user_id int,
   order_date Date
  );

    INSERT INTO mytable(user_id,order_date) VALUES (5963,'2018-01-01');
    INSERT INTO mytable(user_id,order_date) VALUES (5963,'2018-01-29');
    INSERT INTO mytable(user_id,order_date) VALUES (5963,'2018-01-30');
    INSERT INTO mytable(user_id,order_date) VALUES (5962,'2018-01-01');
    INSERT INTO mytable(user_id,order_date) VALUES (5962,'2018-02-25');
    INSERT INTO mytable(user_id,order_date) VALUES (5962,'2018-04-03');
SELECT 
  user_id, 
  COUNT(order_date) AS total_orders

FROM 
  mytable 

GROUP BY 1

having 
  ROUND(julianday(order_date) - julianday(MIN(order_date))) <= 29 

order by 1 desc;

在上面的代码中:

  • user_id = 5963:总共返回3个订单,预期为2。
  • user_id = 5962:返回3笔订单,预期1笔

3 个答案:

答案 0 :(得分:0)

s3://<bucket_name>/profile/index.html

答案 1 :(得分:0)

注意:以下内容需要Sqlite 3.25或更高版本,因为它使用窗口函数:

WITH cte AS (
 SELECT user_id, order_date
      , date(first_value(order_date) OVER (PARTITION BY user_id ORDER BY order_date)
           , '+29 days') AS cutoff_date
 FROM mytable)
SELECT user_id, count(order_date) AS total_orders
FROM cte
WHERE order_date < cutoff_date
GROUP BY user_id
ORDER BY user_id;

在您的示例数据上,它给出:

user_id     total_orders
----------  ------------
5962        1           
5963        2          

如果经常运行,请考虑添加索引:

CREATE INDEX mytable_idx_uid_order ON mytable(user_id, order_date);

答案 2 :(得分:0)

使用此查询:

select user_id, min(order_date) mindate
from mytable 
group by user_id

您可以获得每个用户的第一订单日期。
您所要做的就是将其加入表格:

select 
  m.user_id,
  count(*) total
from mytable m inner join (
  select user_id, min(order_date) mindate
  from mytable 
  group by user_id
) g on g.user_id = m.user_id
where round(julianday(m.order_date) - julianday(g.mindate)) < 29 
group by m.user_id

请注意,我已将条件从<= 29更改为< 29
因为您真正想要的是日期之间的最大距离
是28天,例如2018-01-012018-01-2929 - 1 = 28
请参见demo
结果:

| user_id | total |
| ------- | ----- |
| 5962    | 1     |
| 5963    | 2     |