MySql pomoc przy zapytaniu - wyliczyć średnią z liczby wystapień dziennie by user_id

0

Witam, dopiero stawiam pierwsze kroki i jeszcze mam problem jak skonstruować podzapytanie
proszę o wyrozumiałość i podpowiedź jak mam podliczyć średnią dla User_ID dziennie
Tutaj wyciagnołem dane w układzie
user_id // Data // Ilość
1000 // 2019-06-10 // 26 itd

teraz chcę po user_id policzyć średnią dla user_id np tydzień po tygodniu

na razie mam jakby środek warunku który chciałbym zagregować jako średnią.

select distinct(BB.user_id), DATE_FORMAT(BB.date,'%Y/%m/%d') AS niceDate, count(BB.id) as Liczba
from moja_tab as BB
group by user_id, niceDate
order by niceDate desc

z góry dziękuję za pomoc Roberto

0

no to pobierz numer tygodnia i pogrupuj:

select
    user_id
   ,week(data)
   ,avg(ilosc)
from
    tab
group by
   user_id
  ,week(data)
0

Dziękuje za odpowiedź no tak właśnie to między czasie ogranołem odnośnie %Y,%u
ale dalej count(BB.id) działa mi to dobrze czy COUNT as Liczba
i mam wstawić teraz obok AVR(Liczba)
..
jak wstawiam AVG(BB.id) to podlicza mi sumy ID czyli 12345+12349 zamiast dodać wartości po count 21+31+33

select  distinct(BB.user_id), DATE_FORMAT(BB.date,'%u') AS week,DATE_FORMAT(BB.date,'%W') as Nazwa_Dzień, DATE_FORMAT(BB.date,'%M,%d,%Y') as data, count(BB.id) as Liczba
from tabela1 as BB
group by BB.user_id, DATE_FORMAT(BB.date,'%Y,%u')
order by DATE_FORMAT(BB.date,'%Y,%u') desc, DATE_FORMAT(BB.date,'%j') desc 
1

Piszesz strasznie chaotycznie i mam wrażenie, że bez zrozumienia, odpowiedz mi na kilka pytań:

  1. co to jest wh Ciebie i czemu ma słuzyc: distinct(BB.user_id)?
  2. Co znaczy stwierdzenie ale dalej count(BB.id) działa mi to dobrze czy COUNT as Liczba

Ja wiem, że mysql na wiele pozwala, ale wyrób sobie nawyk dodawania kolumn po ktorych grupujesz do group by, bo zaboli jak zmienisz silnik, który tego nie wspiera.

jak wstawiam AVG(BB.id) to podlicza mi sumy ID czyli 12345+12349 zamiast dodać wartości po count 21+31+33

avg to funkcja licząca średnią więc nie może zwracać sumy id... count zlicza wystapienia, pytasz o średnią a jej nie liczysz, zakladam, że chcesz policzyć średnią z kolumny ilość a jej nie widzę...

0

Panczo faktycznie będzie lepiej jak napiszę o co mi chodzi jako wynik.

Ok już wyjaśniam.
(faktycznie distinct na id nie ma znaczenia bo to sa unikaty)

Opiszę to co wg mnie zliczam.
dzięki Count ID zliczam ilość wierszy zwracanych wg grupowania. Później w danym tygodniu sortuje je od największej do najmniejszej.
Czyli teraz podliczyłem że USER miał
tygodniu 22 = 100 wystąpień (100 wiersz)
tygodniu 23 = 89 wystąpień
tygodniu 24 = 40 wystąpień

A co chciałbym uzyskać:
W tabeli chciałbym mieć jednocześnie
tydzień 22 / 100 wystąpień / 20 średnia tygodniowa

A chciałbym mieć średnie
np by DAY zakładając tydzień pracujący 5 dni
tydzień 22 średnia 20
np by MSC średnia 15

select   BB.user_id, DATE_FORMAT(BB.date,'%u') AS week,count(BB.id) as Liczba 
from Tabela1 as BB
group by BB.user_id, DATE_FORMAT(BB.date,'%Y,%u')
order by DATE_FORMAT(BB.date,'%Y,%u') desc, DATE_FORMAT(BB.date,'%j') desc , Liczba desc


0

Średnia to suma / ilość, co jest sumą?

0

nie liczę sumy funkcją SUM. (z wartości kolumny id)
Zliczam ilość wystąpień count. (kolumny id dla danego okresu)

Mam wartość która jest sumą wystąpień.
i z tej sumy wystąpień chciałbym policzyć średnią.

0

Ja mam problem ze zrozumieniem tego co piszesz, To gdzie masz wartość tej sumy?

0
USER_ID MONTH WEEK Liczba wystąpień USER_ID w tygodniu AVERAGE_BY_MONTH
1099 6 24 200 150
1099 6 23 100 150

Ok już chyba rozumiem dlaczego nie możemy się dogadać. Staram się jak najbardziej rzetelnie przedstawić problem:)
w count wystarczy ze wpiszę gwiazdę. (i nie podaję tam konkretnej kolumny)
count(*) as 'Liczba wystąpień USER_ID w tygodniu'
A finalnie interesuje mnie policzenie średniej z tej agregacji którą wywołałem COUNT.
Obraz znaczy więcej niż treść więc może teraz będziesz mógł mnie zrozumieć.

USER_ID MONTH WEEK Liczba wystąpień USER_ID w tygodniu AVERAGE_BY_MONTH
1099 6 24 200 150
1092 6 24 70 84,5
921 6 24 55 71,5
883 6 24 99 88
110 6 24 88 60,5
999 6 24 77 44
1099 6 23 100 150
1092 6 24 99 84,5
921 6 24 88 71,5
883 6 23 77 88
110 6 23 33 60,5
999 6 23 11 44

0

W czym ma pomóc przykład który podałeś, moze zacznijmy od danych początkowych, zamiast wyniku...

0

Ok wstawię popołudniu dane z pierwotnej tabeli.
Ale tak w skòcie w tabeli pojawia się np. user_id O numerze 1099 w tygodniu 24 w 200 wierszach. 200 razy.

0

To wiem, wiem też, że ma srednią 150, więc, żeby miec srednią 150 to suma musi wynosić 30000 => 30000/200, skąd bierzesz te 30000?

0

Nie wiem na ile to pomoze.
planowałem poprosić o prostą wędkę. I myślałem że resztę jakoś wymyślę. Ale ponieważ ciężko mi to przedstawić to opowiem jaki jest cel docelowy in my mind😀 może finalnie się okazać że przekombinowałem.

Żeby wyliczyć średnią
chciałbym dzielić pezez dni robocze usera czyli jeśli dla usera wystąpi data to już dzielimy przez tą wartość.
Czyli jeśli user_id występuje 200 w tygodniu a
A zdarzenie dla niego w danym tygodniu są w bazie w 3 datach.
To średnią z tygodnia to np 200/3 Ale jeśli dla usera jest 7 dat w bazie. Tzn że 200/7.

Coś Ala efektywność.

Czyli to że dla id_usera jest w bazie to znaczy że wykonał zdarzenie które zalicza baza. I które mnie interesuje.

0

jeżeli rozumiem to ilosc rekordów przez liczbe dat liczona pojedynczo?

select
    user_id
   ,week(data)
   ,count(*)/count(distinct data)
from
    tab
group by
   user_id
  ,week(data)
0

Chyba o to chodzi😀
( jestem teraz na telefonie)
Ps
Sprawdzę asap
Jeśli data z distinct jest wybierana dla każdego usera osobno to będzie po temacie. Dziękuję za wsparcie Pancho

1 użytkowników online, w tym zalogowanych: 0, gości: 1