Самостоятельно присоединиться к столу - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь присоединить таблицу к себе, чтобы получить все session_ids от клиентов, у которых в некоторой (более поздней) точке было значение goal_completion.

Таблица:

<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>clientid</th><th>sessionid</th><th>goalcompletion</th></tr></thead><tbody>
 <tr><td>1</td><td>a</td><td>0</td></tr>
 <tr><td>1</td><td>b</td><td>0</td></tr>
 <tr><td>1</td><td>c</td><td>1</td></tr>
 <tr><td>2</td><td>x</td><td>0</td></tr>
 <tr><td>2</td><td>y</td><td>0</td></tr>
 <tr><td>2</td><td>z</td><td>0</td></tr>
</tbody></table>

Ожидаемый результат:

<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>clientid</th><th>sessionid</th></tr></thead><tbody>
 <tr><td>1</td><td>a</td></tr>
 <tr><td>1</td><td>b</td></tr>
 <tr><td>1</td><td>c</td></tr>
</tbody></table>

Я попробовал пару версий, но я не могу понять, как это работает. Это моя последняя итерация:

SELECT a.clientid,
       a.session_id,
       a.goal1completions_funnel,
       a.goal2completions_funnel,
       a.goal3completions_funnel
FROM _demo.ga_conversions_test a
left JOIN _demo.ga_conversions_test b
  ON a.session_id = b.session_id
  AND (b.goal3completions_funnel = 1
     OR b.goal1completions_funnel = 1
     OR b.goal2completions_funnel = 1)

Можете ли вы привести меня на правильный путь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

Кажется, причина того, что вы не можете получить желаемый результат, состоит в том, что вы объединяете таблицы с одинаковым идентификатором session_id. Попробуйте это:

Select ....
From _demo.ga_conversions_test a
left join _demo.ga_conversions_test a on a.session_id < b.session_id (and other criteria)

Посмотрите, работает ли это. Если нет, то публикация образца вашей структуры данных поможет нам лучше понять. Если вам дали решение, отметьте мой ответ как принятое решение.

0 голосов
/ 15 марта 2019

Это то, что вы хотите?

select ct.*
from _demo.ga_conversions_test ct
where exists (select 1
              from _demo.ga_conversions_test ct2
              where ct2.session_id = ct.session_id and
                    1 in (goal1completions_funnel, goal2completions_funnel, goal3completions_funnel) and
                    ct2.<timecol> > ct.<ctimecol>
             );
0 голосов
/ 15 марта 2019

Я думаю, вам не нужно использовать объединение для этой задачи. Пожалуйста, попробуйте:

select session_id
from _demo.ga_conversions_test 
where goal1completions_funnel=1 OR goal2completions_funnel=1 OR goal3completions_funnel=1
group by session_id

РЕДАКТИРОВАТЬ: Исходя из предоставленных данных, на вашем месте я нашел бы клиентов, имеющих более двух типов числа завершенных целей, и использовал бы внутреннее соединение, как показано ниже:

with cte as (
   select clientid, count(distinct goalcompletion) as CountDifferentGoalCompletion
   from _demo.ga_conversions_test
   group by clientid
   having count(distinct goalcompletion) > 1
)
select a.clientid, a.sessionid
from _demo.ga_conversions_test a
inner join cte on cte.clientid = _demo.ga_conversions_test.clientid

EDIT2: если структура cte не работает (не будет работать, если ее нет в SQL Server), то:

select a.clientid, a.sessionid
from _demo.ga_conversions_test a
inner join (select clientid, count(distinct goalcompletion) as CountDifferentGoalCompletion
            from _demo.ga_conversions_test
            group by clientid
            having count(distinct goalcompletion) > 1) x 
on x.clientid = a.clientid
...