SQL, найти «пути» в SQL-Rows (сгруппировать по / разным)? - PullRequest
0 голосов
/ 24 октября 2018

надеюсь, что кто-то может помочь мне с этим примером mysql:

hash, version, action
a1..., A, pageview
a2..., A, pageview
a2..., B, pageview
a2..., X, lead
a3..., A, pageview
a3..., B, pageview
a4..., A, pageview
a4..., X, lead
a5..., B, pageview
a6..., A, pageview
a6..., X, lead

Как я могу ответить на следующие вопросы одним утверждением?

  • Список всех хэшей, в которых есть строка с версией = A (только!), И еще одна строка с действием = лидерство
  • Список всех хэшей, в которых есть строка с версией = B (только!) и еще одна строка с действием = лидерство
  • Список всех хэшей, имеющих действие с версией A, еще одна строка с версией B и строка с действием = лидерство

Я пробовал несколькоутверждения, подобные приведенным ниже, с выделенным и групповым наличием, но без успеха

SELECT *, count(hash) as count 
FROM it_track 
GROUP BY hash, action 
having count > 1 
   and action like 'lead';

Большое спасибо!

Янв.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Другая версия с объединением как:

1> select t1.hash from it_track t1, it_track t2 
   where t2.hash = t1.hash 
   and t1.version = 'A' 
   and t2.action ='lead';

2> select t1.hash from it_track t1, it_track t2 
   where t2.hash = t1.hash 
   and t1.version = 'B' 
   and t2.action ='lead';

3> select t1.hash from it_track t1, it_track t2 , it_track t3
   where t2.hash = t1.hash 
   and t3.hash = t1.hash
   and t1.version = 'A' 
   and t2.version = 'B'
   and t3.action ='lead';
0 голосов
/ 25 октября 2018

Я думаю, вы хотите что-то вроде этого:

select hash,
       (case when sum(action = 'lead') and
                  min(version) = max(version) and
                  min(version) = 'A'
             then 'A-only, with lead'
             when sum(action = 'lead') and
                  min(version) = max(version) and
                  min(version) = 'B'
             then 'B-only, with lead'
             when sum(action = 'lead') and
                  min(version) <> max(version) 
             then 'Both, with lead'
             else 'Unknown'
      end) as which_group
from it_track
where (action = 'lead' or
       ( action = 'pageview' and version in ('A', 'B') )
      )
group by hash
0 голосов
/ 24 октября 2018
1> select distinct t1.hash from it_track t1 where version = 'A' and exists (select 1 from it_track t2 where t1.hash = t2.hash and t2.action = 'lead');
2> select distinct t1.hash from it_track t1 where version = 'B' and exists (select 1 from it_track t2 where t1.hash = t2.hash and t2.action = 'lead');
3> select distinct t1.hash from it_track t1 where version = 'A' and exists (select 1 from it_track t2 where t2.hash = t1.hash and version = 'B') and exists (select 1 from it_track t3 where t3.action = 'lead' and t3.hash = t1.hash);
...