【问题标题】:First user by category按类别划分的第一个用户
【发布时间】:2020-12-26 08:21:26
【问题描述】:

如何统计每个类别中第一次购买该类别的新用户?例如2015-2020年,如果有人在2015年首次购买,则将在2015年计为新用户,而在2016-2020年则不计。

Table_1(列:product_name、date、category、sales、user_id)

想得到如下结果

【问题讨论】:

  • 数据库是什么?
  • 这是 postgre SQL :)

标签: sql postgresql partition


【解决方案1】:

您需要从子查询开始,以获取每个用户在该类别中购买的第一个日期。这是一个非常简单的group by 问题:

select 
user_id, 
category, 
min(date) as first_category_purchase
from my_table 
group by user_id, category;

接下来,您可以使用 Postgres 的 date_trunc 函数按年份和类别分组,将您的第一个查询用作子查询:

select
category,
date_trunc('year', first_category_purchase)
count(*)
from (
select 
user_id, 
category, 
min(date) as first_category_purchase
from my_table 
group by user_id, category
) a 
group by 1, 2;

【讨论】:

  • 当然。如果有帮助,请随时投票并接受答案
【解决方案2】:

在 Postgres 中,一种方法是 group bydistinct on 之后:

select date, count(*) as num_new_users
from (select distinct on (user_id, category) t.*
      from t
      order by user_id, category, date asc
     ) d
group by date
order by date;

如果date 确实是日期而不是年份,那么您需要使用to_char()date_trunc() 之类的内容将其转换为年份。

【讨论】:

  • 感谢您的帮助!这似乎是一个很好的方法,如果我想在大查询中应用它,你能告诉我吗?如果我不能使用“Distinct on”功能?
  • @MKMK_79 。 . .这个问题被标记为 Postgres。如果您想要 BigQuery 的答案,请提出 问题并适当标记。
  • 感谢您的帮助!将标记适当的!
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 2021-10-27
  • 2020-12-24
  • 2022-11-27
  • 2018-02-08
  • 1970-01-01
  • 2021-10-29
  • 2018-04-25
相关资源
最近更新 更多