Vinnaren i pepparkakshustävlingen!
2016-10-27, 15:55
  #1
Medlem
Jag vill ha en sammanställning per site hur många som loggat in under 1 månad, men bara de som loggat mindre än 5 gånger under denna tid, resultatet ska typ se ut så här;

+-------------+---------------+
| unique_user | sites |
+--------------+---------------+
| 1000 | site1 |
| 100 | site2 |
| 11000 | site3 |
+--------------+---------------+

SELECT COUNT(DISTINCT(user_name)) AS unique_user, sites
FROM accounting
WHERE stop_timestamp BETWEEN UNIX_TIMESTAMP('2016-07-01 00:00:00') AND UNIX_TIMESTAMP('2016-07-31 23:59:59')
AND COUNT(user_name) < 5
GROUP by sites;

Men jag får det inte att funka, är jag helt fel ute? Någon som har nått förslag hur jag ska tänka?
Citera
2016-10-27, 16:21
  #2
Medlem
Citat:
Ursprungligen postat av jukkaj
Jag vill ha en sammanställning per site hur många som loggat in under 1 månad, men bara de som loggat mindre än 5 gånger under denna tid, resultatet ska typ se ut så här;

+-------------+---------------+
| unique_user | sites |
+--------------+---------------+
| 1000 | site1 |
| 100 | site2 |
| 11000 | site3 |
+--------------+---------------+

SELECT COUNT(DISTINCT(user_name)) AS unique_user, sites
FROM accounting
WHERE stop_timestamp BETWEEN UNIX_TIMESTAMP('2016-07-01 00:00:00') AND UNIX_TIMESTAMP('2016-07-31 23:59:59')
AND COUNT(user_name) < 5
GROUP by sites;

Men jag får det inte att funka, är jag helt fel ute? Någon som har nått förslag hur jag ska tänka?
Du måste använda HAVING istället för "AND COUNT(user_name) <5", kan finnas fler fel också, men det var det jag kom att tänka på.
Citera
2016-10-27, 16:23
  #3
Medlem
Jag har testat det också
Det är nått jag inte får rätt.
Citera
2016-10-27, 16:24
  #4
Medlem
Citat:
Ursprungligen postat av jukkaj
Jag har testat det också
1. Hur ser ditt schema ut
2. Hur ser resultatet ut?
Citera
2016-10-27, 16:27
  #5
Medlem
Resultatet ser du här ovan.
Databasen innehåller tabellen accounting och fälten, user_name, sites och stop_timestamp, plus lite annat också.
Citera
2016-10-27, 16:38
  #6
Medlem
Citat:
Ursprungligen postat av jukkaj
Resultatet ser du här ovan.
Databasen innehåller tabellen accounting och fälten, user_name, sites och stop_timestamp, plus lite annat också.
Nej, det du har skrivit ovan är väl ändå ditt förväntade resultat?
Citera
2016-10-27, 16:47
  #7
Medlem
SELECT COUNT(DISTINCT(name)), site
FROM Test
GROUP BY site
HAVING COUNT(DISTINCT(name)) < 5;

Detta fungerar för mig, testa detta, fungerar inte det har du något fel på dina timestamps, vad jag vet så returnerar UNIX_TIMESTAMPS() antal sekunders som passerat sen '1970-01-01 00:00:00',
resultatet av ditt WHERE statement kommer alltså plocka ut alla tuples vars stop_timestamp ligger mellan två heltal, dvs din variabel stop_timestamp måste vara ett heltal.
Jag kan ha fel angående timestamps, men det var min tanke.

Du kanske borde testa WHERE UNIX_TIMESTAMPS(stop_timestamp) BETWEEN UNIX_TIMESTAMPS(X) UNIX_TIMESTAMPS(Y)
__________________
Senast redigerad av Oscillation 2016-10-27 kl. 16:53.
Citera
2016-10-28, 08:42
  #8
Medlem
Tack Oscillation för att du försöker hjälpa mig.

Jo, det är ovanstående resultat jag önskar mig, men ej får.

När jag kör queryn får jag "Invalid use of group function". Nej, det är inte fel på UNIX_TIMESTAMP, det använder jag för att tiden är i epoc tid i db'n, och samma använder jag i flera andra querys.

Jag har försökt få denna och varianter av denna query, som med HAVING och nästlad SELECT, men antingen får jag 1 träff per site eller felmeddelande, och 1 träff per site blir flera miljoner och ohanterbart, ev. kan jag skriva till temptabell och jobba vidare därifrån, men min kunskap är inte tillräcklig för detta ännu
Citera
2016-10-28, 15:19
  #9
Medlem
Citat:
Ursprungligen postat av jukkaj
Tack Oscillation för att du försöker hjälpa mig.

Jo, det är ovanstående resultat jag önskar mig, men ej får.

När jag kör queryn får jag "Invalid use of group function". Nej, det är inte fel på UNIX_TIMESTAMP, det använder jag för att tiden är i epoc tid i db'n, och samma använder jag i flera andra querys.

Jag har försökt få denna och varianter av denna query, som med HAVING och nästlad SELECT, men antingen får jag 1 träff per site eller felmeddelande, och 1 träff per site blir flera miljoner och ohanterbart, ev. kan jag skriva till temptabell och jobba vidare därifrån, men min kunskap är inte tillräcklig för detta ännu
Du får väl börja felsöka, vad händer om du tar bort hela din where sats, alltså kör:
SELECT COUNT(DISTINCT(user_name)) AS unique_user, sites
FROM accounting
GROUP by sites;

om det fungerar testa

SELECT COUNT(DISTINCT(user_name)) AS unique_user, sites
FROM accounting
GROUP by sites;
HAVING COUNT(DISTINCT(user_name)) < 5

fungerar det testa kasta in din where sats
Citera
2016-11-01, 08:57
  #10
Medlem
Jag får fel värden, jag måste ha tänkt fel någonstans.
Dessvärre måste jag lämna denna instressanta query och jobba vidare med annat.
Jag kommer förmodligen att ta upp denna fråga igen vid ett senare tillfälle och postar lösningen då, om jag lyckas lösa det . Tack för hjälpen jag fått.
Citera
2016-11-02, 21:57
  #11
Medlem
Sgt.McBadasss avatar
Hej!

Detta funka för mig:

Kod:
select s.Sites, count(s.Users)
from
	(
	select user_name as Users, sites as Sites, count(sites) as CountLogons
	from accounting 
        where [dina timestamp-begränsningar]
	group by user_name, sites having count(sites) < 5
        ) s
group by s.Sites;


Då har jag antagit att din tabell har denna layout

user | VisitedSite
---------------------
A | site1
A | site1
A | site2
B | site1
B | site1

där varje inloggning genererar en rad med usern och vilken sida det gäller.


Det det ovanstående sql-statement gör är att först tittar hur många gånger en
specifik user loggat in på en sida (den nästlade biten). Eftersom vi grupperar
på user_name och site så sammanställs resultatet av det nästlade statementet
i unika users och tillhörande sidor. Sedan räknas antalet users per sida från
det första datasettet.

count(sites) as CountLogons behövs egentligen inte men om du kör det nästlade statementet ensamt kan du se antal inloggningar per user per sida tillsammans med det.



Hoppas det hjälper!
Citera
2017-01-04, 09:07
  #12
Medlem
Yes, det gav resultat.
Tack för hjälpen.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback