2015-11-23 3 views
1

У меня есть сценарий, где люди могут делать action1 и выручать; или action1 & action2 & выйдут, или они могут сделать action1, action2 &, а затем сказать «Я хочу играть больше». Я хочу, чтобы найти число людей на каждом уровне:
- ли действие1
- ли действие1 и action2
- ли ДЕЙСТВИЙ1 и Мотор2, а также сказал: «Я хочу играть больше»SQL для анализа воронки

Каждый раз, когда пользователь делает действие , мы регистрируем sessionId. Поэтому, если использование запускает действие 1 и действие 2, у нас будет две строки с одинаковым идентификатором сеанса, одинаковым идентификатором клиента и другими действиями.

╔══════════════════════════════════════╦════════════════╦════════╗ 
║    SessionId    ║ FirstRunAction ║ UserId ║ 
╠══════════════════════════════════════╬════════════════╬════════╣ 
║ 039af321-457e-41a6-b303-41ca935b0877 ║ action_1  ║ eb6 ║ 
║ 039af321-457e-41a6-b303-41ca935b0877 ║ action_2  ║ eb6 ║ 
╚══════════════════════════════════════╩════════════════╩════════╝ 

Данные, указанные выше, приведены в одной таблице. Action1 и action2 находятся в таблице UserAction, но «Я хочу играть больше» находится в отдельной таблице, называемой «Play».

Я сделал следующее, но это не правильно.

Я хочу иметь логику типа if. Искать действие 2 только тогда, когда действие 1 есть & поиск «Я хочу играть больше», когда на этой сессии также есть action1 и action2. Я написал один ниже, но не знаю, как хранить результаты на любом уровне &, если то, что я делаю, является правильным. У меня есть 6 миллионов данных для начала. Любая помощь?

Action1Results = SELECT [SessionId] 
         ,[Action] 
         ,[UserId] 
       FROM [Test].[dbo].[UserAction] 
       WHERE [Action] = 'action_1'; 

Action2Results = SELECT [SessionId] 
         ,[Action] 
         ,[UserId] 
       FROM [Test].[dbo].[UserAction] 
       WHERE [Action] = 'action_2';  

PlayMoreResults = SELECT [SessionId] 
         ,[Play] 
         ,[UserId] 
       FROM [Test].[dbo].[UserPlay] 
       WHERE [Play] = 'I want to play more'; 

FinalResults = SELECT [SessionId] 
        ,[UserId] 
       FROM [Test].[dbo].[Action] with (nolock) 
       INNER JOIN [Test].[dbo].[UserPlay] with (nolock) 
       ON [Test].[dbo].[UserPlay].SessionId = [Test].[dbo].[Action].SessionId; 

На самом деле может быть много действий, но они всегда будут заканчиваться _1 и _2. Список действий может меняться со временем.

E.g. У меня могут быть такие действия, как:

«Write_1», «Write_2», «Birds_1», Birds_2 »,« Pen_1 »,« Pen_2 ».

Так что для них я должен видеть, как много сделал

'Write_1" -> "Write_2" -> 'Я хочу играть больше'',

то сколько сделал

'Birds_1" -> "Birds_2" -> 'Я хочу играть больше'',

то сколько сделал

'Pen_1" -> "Pen_2" -> 'Я хочу играть больше''

и так далее. Так что воронка для каждого типа.

+0

Просьба представить более подробную информацию. Какой db вы используете MySQL или SQLserver? – davejal

+0

честный вопрос @davejal кроме [dbo] kinda отдает его (сервер MS Sql) :) –

+0

Спасибо, Хуан. На самом деле может быть много действий, но они всегда будут иметь _1 и _2. Список действий может меняться со временем. Например. У меня могут быть такие действия, как «Write_1», «Write_2», «Birds_1», «Birds_2», «Pen_1», «Pen_2». Поэтому для этого мне нужно посмотреть, сколько из них «Write_1» -> «Write_2» -> «Я хочу играть больше», а затем сколько «Birds_1» -> «Birds_2» -> «Я хочу играть больше», ', то сколько же «Pen_1» -> «Pen_2» -> «Я хочу играть больше» и т. д. Так что воронка для каждого типа. – SweetNeetu

ответ

0

Я полагаю, действие может быть только ('action_ 1','action_2') other wise you have to compare for those value on the ON-WHERE and the CASE`

SqlFiddle Demo

WITH CTE as (
    SELECT UA1.SessionID, 
      UA1.UserId, 
      UA1.FirstRunAction Action1, 
      UA2.FirstRunAction Action2, 
      UP.Play Action3 
    FROM UserAction UA1 
    LEFT JOIN UserAction UA2 
      ON UA1.SessionID = UA2.SessionID 
      AND UA2.UserId = UA2.UserId 
      AND UA1.FirstRunAction <> UA2.FirstRunAction   
    LEFT JOIN UserPlay UP 
      ON UA1.SessionID = UP.SessionID 
      AND UA2.UserId = UP.UserId 
    WHERE UA1.FirstRunAction = 'action_1' 
), classify as (
SELECT CASE 
      WHEN Action3 IS NOT NULL AND Action3 = 'I want to play more' THEN 'TYPE 3' 
      WHEN Action2 IS NOT NULL THEN 'TYPE 2' 
      WHEN Action1 IS NOT NULL THEN 'TYPE 1' 
      ELSE 'TYPE 0' 
     END as actionType 
FROM cte 
) 
SELECT actionType, count(*) 
FROM classify 
GROUP BY actionType 

КТР часть OUTPUT

| SessionID | UserId | Action1 | Action2 |    Action3 | 
|-----------|--------|----------|----------|---------------------| 
|   1 |  1 | action_1 | action_2 | I want to play more | 
|   2 |  2 | action_1 | (null) |    (null) | 
|   3 |  3 | action_1 | action_2 |   Don’t Know | 
|   4 |  4 | action_1 | (null) |    (null) | 
|   5 |  5 | action_1 | action_2 |    (null) | 
  • Так UserID = 1 имеет все три действия будут TYPE3
  • UserID = (2, 4) только одно действие будет типа1
  • UserID = 3 имеет 3 действие, но в прошлом один разве I want to play more так типа 2, как UserID = 5

Final Output

| actionType | | 
|------------|---| 
|  TYPE 1 | 2 | 
|  TYPE 2 | 2 | 
|  TYPE 3 | 1 | 

Если у вас есть таблица USERS, вы можете начать с этого, так что получить счет того, сколько пользователь имеет TYPE 0

+0

Спасибо, Хуан. На самом деле может быть много действий, но они всегда будут иметь _1 и _2. Список действий может меняться со временем. Например, я могу Дейс ns like: – SweetNeetu

+0

Я не вижу примера, можете ли вы подробнее рассказать об этом вопросе? Я отвечаю на вопрос, который вы делаете, трудно дать вам ответ, если вы не предоставите данные примера и желание. –

0

Это должно дать вам подсчет различных пользователей каждым session_category -

3 = I want to play more 
    2 = action_1, and action_2 
    1 = action_1 

Примечание это будет подсчитывать пользователю несколько раз через session_categories, если пользователь на самом деле делает только Действие_1 и один action_1 + action_2 на другом. Вы не объясняете, как вы планируете иметь дело с этой ситуацией (если я не пропустил что-то).

https://gist.github.com/leonpanokarren/56f313130118dad47113

Я попытался наклеивать этот запрос рядный здесь сегодня Gazillion раз напрасно.

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