2016-01-18 3 views
6

Pracuję nad zapytaniem, które teraz policzy liczbę unikalnych dni logowania na użytkownika, umieść je w wiadrze (1-2, 3-4 log dni itd.) I zwróć liczbę każdego użytkownika w każdym wiadrze według działu. Przepraszam, jeśli nie jest to zbyt jasne i mam nadzieję, że poniższe przykłady pomogą zilustrować moje pytanie.MySQL - grupa według liczby użytkowników w przedziałach unikalnych dni logowania i według działu

Mam tabeli tak:

+-------------+-----------+------------+-----------------+ 
| time  | user_name | dept |  event  | 
+-------------+-----------+------------+-----------------+ 
| 2016-01-04 | Joe  | finance | logged in  | 
| 2016-01-04 | Jeff  | marketing | logged in  | 
| 2016-01-04 | Jeff  | marketing | project created | 
| 2016-01-04 | Bob  | finance | logged in  | 
| 2016-01-04 | Mark  | accounting | logged in  | 
| 2016-01-05 | Bob  | finance | logged in  | 
| 2016-01-08 | Bob  | finance | logged in  | 
| 2016-01-09 | Jeff  | marketing | logged in  | 
| 2016-01-10 | Jeff  | marketing | logged in  | 
| 2016-01-11 | Nate  | accounting | logged in  | 
| 2016-01-11 | Nate  | accounting | project created | 
+-------------+-----------+------------+-----------------+ 

chcę wrócić tabelę tak:

+------------------+-----------------+------------+ 
| number of logins | number of users | dept | 
+------------------+-----------------+------------+ 
| 1-2    |    1 | finance | 
| 3-4    |    1 | finance | 
| 5+    |    0 | finance | 
| 1-2    |    0 | marketing | 
| 3-4    |    1 | marketing | 
| 5+    |    0 | marketing | 
| 1-2    |    2 | accounting | 
| 3-4    |    0 | accounting | 
| 5+    |    0 | accounting | 
+------------------+-----------------+------------+ 

Jak na razie, moja kwerenda wygląda następująco:

select 
(case when count(distinct(`time`)) between 1 and 2 then '1-2' 
     when count(distinct(`time`)) between 3 and 4 then '3-4' 
     else '5+' 
     end) as buckets, dept, user_name 
    from change_log where event in ('logged in') 
    group by dept, user_name 

Zwracam jednak tabelę podobną do poniższej, która jest najbliższa mojemu dostaniu się do tego, co chcę, ale nie jestem pewien, jak ją rzucić wiadra i dział.

+---------+------------+-----------+ 
| buckets | dept | user_name | 
+---------+------------+-----------+ 
| 1-2  | accounting | Mark  | 
| 1-2  | accounting | Nate  | 
| 3-4  | finance | Bob  | 
| 1-2  | finance | Joe  | 
| 3-4  | marketing | Jeff  | 
+---------+------------+-----------+ 

Odpowiedz

2

Coś takiego?

select buckets, dept, count(user_name) no_of_u from 
(select 
(case when count(distinct(`time`)) between 1 and 2 then '1-2' 
     when count(distinct(`time`)) between 3 and 4 then '3-4' 
     else '5+' 
     end) as buckets, dept, user_name 
    from change_log where event in ('logged in') 
    group by dept, user_name) 
group by buckets, dept 
+0

To wydaje się działać! Mam "Każda wyprowadzona tabela musi mieć swój własny alias." komunikat o błędzie, ale po podaniu aliasu do wyprowadzonej tabeli z drugiej instrukcji select działało. Wielkie dzięki! Nadal próbuję uzyskać wygodne z zagnieżdżonych instrukcji select. – user5805996

+0

Używam ich, jeśli naprawdę muszę. W większości przypadków mam wiele zagnieżdżonych strojów wybieranych i nie rozumiem. W takich przypadkach staram się tworzyć tymczasowe tabele i wykorzystywać je do uzyskania mojego końcowego wyniku. – Nomeaning25

-1

Wystarczy, aby mieć pewność, rozumiem, jesteś po prostu staramy się to zrobić:

select 
    (case when count(distinct(`time`)) between 1 and 2 then '1-2' 
      when count(distinct(`time`)) between 3 and 4 then '3-4' 
      else '5+' 
    end) as buckets, dept, count(*) as `number of users` 
from change_log where event in ('logged in') 
group by dept, buckets 

Teraz nie można tego zrobić w MySQL, ponieważ nie można grupować na wyjściu oświadczenie o sprawie, ale funkcjonalnie to pożądany wynik?

0

Ale można to zrobić tak:

select 
    ELT(LEAST(count(*),5), '1-2', '1-2', '3-4', '3-4','5+') as buckets, 
    dept, 
    count(*) as `number of users` 
FROM change_log where event in ('logged in') 
WHERE event in ('logged in') 
GROUP BY 
    dept, 
    ELT(LEAST(count((*),5), '1-2', '1-2', '3-4', '3-4','5+');