2015-06-10 4 views
0

У меня есть таблица shopevent, в которой есть строки транзакций с идентификатором столбца, user_id, shop_date. я могу тянуть магазин событие с sometthing какПолучение новых уникальных пользователей покупки из таблицы покупок

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

Что вы действительно хотите, чтобы кто-то совершил покупку. Для этой покупки они уникальны. (Если я правильно понимаю ваш вопрос.) Вы можете рассчитать это, используя агрегацию.

Я не уверен, какой результат вы хотите. Я также не понимаю, что для вас означает «один месяц». Однако, следующий делает расчет по дням:

select (shop_date - ut.user_registration_dt) as days_between, count(*) 
from User_Table ut JOIN 
    (select se.user_id, min(se.shop_date) as minsd 
     from shop_events se 
     group by se.user_id 
    ) se 
    on ut.user_id = se.user_id 
where ut.user_registration_dt between '2012-01-01' and '2012-01-31' 
group by days_between 
order by days_between; 
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) вы Виль Я получаю те же результаты, что и исходный запрос.

Смежные вопросы