我有一个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个用户。如何在这样的查询中获得新的唯一用户?
任何帮助都会很棒。
答案 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
)过滤此表格,您将获得与原始查询相同的结果。