从购物台获取新的独特购买用户

时间:2015-06-10 21:54:05

标签: sql postgresql

我有一个shopevent表,其中包含列id为user_id,shop_date的事务行。 我可以通过类似

之类的东西来推销商店活动
SELECT * FROM SHOP_EVENTS A LEFT OUTER JOIN USER_TABLE B ON A.USER_ID = B.USER_ID WHERE B.USER_REGISTRATION_DT BETWEEN '2012-01-01' AND '2012-01-31'

我还有一个用户表,我可以从中获得在特定月份注册的用户。

SELECT * FROM USER_TABLE WHERE registration_date between '2012-01-01' AND '2012-01-31'

我想要实现的是在注册后每个月有多少新的独特用户购买。

这是我正在尝试的查询。

SELECT
CASE
 WHEN shop_date BETWEEN     '2012-01-01'  AND '2012-01-31' THEN 1
 WHEN shop_date BETWEEN     '2012-02-01'    AND '2012-02-29' THEN 2
 WHEN shop_date BETWEEN     '2012-03-01'    AND '2012-03-31' THEN 3
 WHEN shop_date BETWEEN     '2012-04-01'    AND '2012-04-30' THEN 4
 WHEN shop_date BETWEEN     '2012-05-01'    AND '2012-05-31' THEN 5
 WHEN shop_date BETWEEN     '2012-06-01'    AND '2012-06-30 'THEN 6
 WHEN shop_date BETWEEN     '2012-07-01'    AND '2012-07-31 'THEN 7
 WHEN shop_date BETWEEN     '2012-08-01'    AND '2012-08-31 'THEN 8
 WHEN shop_date BETWEEN     '2012-09-01'    AND '2012-09-30 'THEN 9
 WHEN shop_date BETWEEN     '2012-10-01'    AND '2012-10-31 'THEN 10
 WHEN shop_date BETWEEN     '2012-11-01'    AND '2012-11-30 'THEN 11
 WHEN shop_date BETWEEN     '2012-12-01'    AND '2012-12-31 'THEN 12
 WHEN shop_date BETWEEN     '2013-01-01'    AND '2013-01-31 'THEN 13
 WHEN shop_date BETWEEN     '2013-02-01'    AND '2013-02-28 'THEN 14
 WHEN shop_date BETWEEN     '2013-03-01'    AND '2013-03-31 'THEN 15
 WHEN shop_date BETWEEN     '2013-04-01'    AND '2013-04-30 'THEN 16
 WHEN shop_date BETWEEN     '2013-05-01'    AND '2013-05-31 'THEN 17
 WHEN shop_date BETWEEN     '2013-06-01'    AND '2013-06-30 'THEN 18
 WHEN shop_date BETWEEN     '2013-07-01'    AND '2013-07-31 'THEN 19
 WHEN shop_date BETWEEN     '2013-08-01'    AND '2013-08-31 'THEN 20
 WHEN shop_date BETWEEN     '2013-09-01'    AND '2013-09-30 'THEN 21
 WHEN shop_date BETWEEN     '2013-10-01'    AND '2013-10-31 'THEN 22
 WHEN shop_date BETWEEN     '2013-11-01'    AND '2013-11-30 'THEN 23
 WHEN shop_date BETWEEN     '2013-12-01'    AND '2013-12-31 'THEN 24
 WHEN shop_date BETWEEN     '2014-01-01'    AND '2014-01-31 'THEN 25
 WHEN shop_date BETWEEN     '2014-02-01'    AND '2014-02-28 'THEN 26
 WHEN shop_date BETWEEN     '2014-03-01'    AND '2014-03-31 'THEN 27
 WHEN shop_date BETWEEN     '2014-04-01'    AND '2014-04-30 'THEN 28
 WHEN shop_date BETWEEN     '2014-05-01'    AND '2014-05-31 'THEN 29
 WHEN shop_date BETWEEN     '2014-06-01'    AND '2014-06-30 'THEN 30
 WHEN shop_date BETWEEN     '2014-07-01'    AND '2014-07-31 'THEN 31
 WHEN shop_date BETWEEN     '2014-08-01'    AND '2014-08-31' THEN 32
 WHEN shop_date BETWEEN     '2014-09-01'    AND '2014-09-30' THEN 33
 WHEN shop_date BETWEEN     '2014-10-01'    AND '2014-10-31' THEN 34
 WHEN shop_date BETWEEN     '2014-11-01'    AND '2014-11-30' THEN 35
 WHEN shop_date BETWEEN     '2014-12-01'    AND '2014-12-31' THEN 36
 WHEN shop_date BETWEEN     '2015-01-01'    AND '2015-01-31' THEN 37
 WHEN shop_date BETWEEN     '2015-02-01'    AND '2015-02-28' THEN 38
 WHEN shop_date BETWEEN     '2015-03-01'    AND '2015-03-31' THEN 39
 WHEN shop_date BETWEEN     '2015-04-01'    AND '2015-04-30' THEN 40
 WHEN shop_date BETWEEN  '2015-05-01'  AND  '2015-05-31' THEN 41
END AS month,
count(user_id),
count(DISTINCT user_id)
FROM
    shop_events a
inner join user_table b on a.user_id = b.user_id
WHERE
    user_registration_dt between '2012-01-01' and '2012-01-31'

这给了我从第1个月开始每月购买的独特用户。如何获得购买的新唯一身份用户列表。这意味着,让我们说在10,000个注册中,有100个用户在第1个月进行了购买。之后,50个新用户从上个月开始没有购买100个用户。如何在这样的查询中获得新的唯一用户?

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

您真正想要的是第一次有人购买。对于那次购买,它们是独一无二的。 (如果我正确理解你的问题。)你可以使用聚合来计算。

我不确定你想要什么输出。我也不明白“一个月”对你来说意味着什么。但是,以下是按天计算:

{{1}}

答案 1 :(得分:0)

只是拼图的一块":你的冗长CASE条款可以替换为

MONTH(shop_date)+(YEAR(shop_date)-2012)*12

也许你想要这样的东西:

-- lists for users of each registration month (uregmon) the shopping month no. (shopmon),
-- the total count of shopping events (shopcount) and the number of different customers 
-- in that month (custcount).
SELECT uregmon, shopmon, COUNT(suid) shopcount, COUNT(DISTINCT suid) custcount FROM 
( -- derived table: lists all user ids for each shop event in each numbered month
 SELECT MONTH(shop_date)+(YEAR(shop_date)-2012)*12 shopmon,USER_ID suid 
 FROM SHOP_EVENTS
) s JOIN
( -- derived table: lists user ids and the month no. of their registration
 SELECT USER_ID uuid,MONTH(registration_date)+(YEAR(registration_date)-2012)*12 uregmon 
 FROM USER_TABLE
) u ON uuid=suid
GROUP BY uregmon, shopmon

如果您针对特定注册月份(即WHERE uregmon=1)过滤此表格,您将获得与原始查询相同的结果。