2016-02-26 11 views
5

mam 3 tabele w MySQL: 1) strona (id, tytuł) 2) użytkownik (id, name) 3) page_visit (page_id, visitor_id, timestamp_of_visit)MySQL kwerendy, aby znaleźć szereg unikalnych nowych użytkowników tygodniowo

Odwiedzający mogą odwiedzać strony wiele razy, przez kilka dni. W związku z tym, chociaż będziemy mieć jeden wiersz dla strony i jeden wiersz dla gościa, możemy mieć kilka wierszy page_visit, każdy z sygnaturą czasową wizyty.

Próbuję znaleźć liczbę niepowtarzalnych użytkowników, według tygodni. Wiem, jak uzyskać zapytanie "według liczby tygodni" dla nie-unikalnych (np. "Ilu użytkowników widziałem każdego tygodnia"). Nie wiem jednak, jak wybierać użytkowników z tygodnia na tydzień, gdy gość pojawia się na liście TYLKO przy pierwszym wyświetleniu.

----------- ----------- ---------------------------- 
| page | | visitor | | page_visit    | 
----------- ----------- ---------------------------- 
|id |title| |id |name | |pid|vid|timestamp of visit| 
----------- ----------- ---------------------------- 
| 1 | p1 | | 1 | v1 | | 1 | 1 | 02-18-2016:08:30 | 
| 2 | p2 | | 2 | v2 | | 1 | 1 | 02-18-2016:10:00 | 
| 3 | p3 | | 3 | v3 | | 1 | 3 | 02-20-2016:23:45 | 
| 4 | p4 | | 4 | v4 | | 2 | 3 | 02-22-2016:07:30 | 
| 5 | p5 | | 5 | v5 | | 3 | 1 | 02-23-2016:08:30 | 
| 6 | p6 | | 6 | v6 | | 3 | 6 | 02-24-2016:09:30 | 

Co wynikowa powinna wskazywać:

------------------------ 
| results    | 
------------------------ 
| Week of | Net new | 
------------------------ 
| 02-15-2016 | 2  | 
| 02-22-2016 | 1  | 

Jak wspomniano, mogę dowiedzieć się, jak pokazać wszystkich gości przez tydzień. Nie wiem, jak zdobyć wyjątkowych użytkowników.

Próbowałem wykonać min (znacznik czasu wizyty), ale w oparciu o to, gdzie próbowałem go, zwrócił najniższy znacznik czasu we wszystkich wierszach (co zrozumiałe ...).

Każda pomoc będzie bardzo ceniona!

Odpowiedz

4

To jest podchwytliwe pytanie, kiedy po raz pierwszy się z tym zetkniesz. Wymaga dwóch poziomów agregacji. Pierwszy dostaje pierwszą wizytę dla każdego odwiedzającego, drugi podsumowuje według czasu. Podsumowanie według dnia:

select date(minvd), count(*) as numvisitors 
from (select vid, min(visitdate) as minvd 
     from page_visit pv 
     group by vid 
    ) v 
group by date(minvd) 
order by date(minvd); 

Tłumaczenie na tygodnie jest zawsze trochę trudne - czy zaczynają się w poniedziałki? Koniec w soboty? W piątki? (Widziałem to wszystko.) Jednak powyższe jest addytywne, więc możesz po prostu dodać wszystkie wartości dla danego tygodnia, aby uzyskać swoją wartość.

+0

Dzięki! Jest to bardzo pomocne i mam rzeczy do pracy oparte na tym! Utknąłem, próbując dowiedzieć się, jak wyrównać elementy, aby móc uruchomić funkcję liczenia. Do obliczeń "tydzień" użyłem następującego formatu: DATE_FORMAT (DATE_ADD (v.minvd, INTERVAL (1-DAYOFWEEK (v.minvd)) DAY), '% Y-% m-% d') AS "Tydzień" i wreszcie "GROUP BY YEARWEEK (v.minvd)" Mój silnik MySQL domyślnie rozpoczynał tydzień w niedzielę. Dziękuję Panu Linoff! – AaCc

2

W przypadku, gdy chcesz to zrobić bez podkwerendzie:

SELECT 
    <week>, 
    COUNT(DISTINCT PV.vid) 
FROM 
    Page_Visit PV 
LEFT OUTER JOIN Page_Visit PV2 ON 
    PV2.vid = PV.vid AND 
    PV2.visit_date < PV.visit_date 
WHERE 
    PV2.vid IS NULL 
GROUP BY 
    <week> 

Jak wspomina Gordon, jak określić tydzień może być trudne. Po prostu dodaj te obliczenia, gdy zobaczysz <week>. Osobiście lubię korzystać z tabeli kalendarza dla tego rodzaju funkcji, ale to zależy od ciebie. Możesz uruchomić dowolne wyrażenia bezpośrednio przed PV.visit_date, aby to ustalić.

Powiązane problemy