sql >> Database >  >> RDS >> Mysql

Selecteer de hoogste 3 scores in elke dag voor elke gebruiker

Kijk eens naar de volgende code, als je antwoord op mijn opmerking yes is :) Sinds je gegevens allemaal in 2012, en de maand november, nam ik de dag.

Vraag:

select y.id, y.userid, y.score, y.datestamp 
from (select id, userid, score, datestamp 
      from scores
      group by day(datestamp)) as y    
where (select count(*) 
       from (select id, userid, score, datestamp
             from scores group by day(datestamp)) as x
       where y.score >= x.score
       and y.userid = x.userid
      ) =1 -- Top 3rd, 2nd, 1st    
order by y.score desc
;

Resultaten:

ID  USERID  SCORE   DATESTAMP
8   2       8.5 December, 07 2012 00:00:00+0000
20  3       6   December, 08 2012 00:00:00+0000
1   1       5   December, 06 2012 00:00:00+0000

Gebaseerd op je laatste updates om te vragen. Als je wat per gebruiker per jaar/maand/dag nodig hebt en dan het hoogste vindt, kun je eenvoudig een aggregatiefunctie toevoegen, zoals sum op bovenstaande vraag. Ik herhaal mezelf, aangezien uw voorbeeldgegevens slechts voor één jaar zijn, is er geen puntengroep per jaar of maand. Daarom nam ik de dag.

select y.id, y.userid, y.score, y.datestamp 
from (select id, userid, sum(score) as score,
      datestamp 
from scores
group by userid, day(datestamp)) as y    
where (select count(*) 
from (select id, userid, sum(score) as score
      , datestamp
from scores
group by userid, day(datestamp)) as x
where y.score >= x.score
and y.userid = x.userid
) =1 -- Top 3rd, 2nd, 1st    
order by y.score desc
;

Resultaten gebaseerd op som:

ID  USERID  SCORE   DATESTAMP
1   1       47.5    December, 06 2012 00:00:00+0000
8   2       16      December, 07 2012 00:00:00+0000
20  3       6       December, 08 2012 00:00:00+0000

BIJGEWERKT MET NIEUWE BRONGEGEVENS VOORBEELD

Simon, kijk eens naar mijn eigen voorbeeld. Omdat je gegevens aan het veranderen waren, heb ik de mijne gebruikt. Hier is de referentie. Ik heb pure ansi . gebruikt stijl zonder enige over partition of dense_rank Merk ook op dat de gegevens die ik heb gebruikt top 2-scores krijgen, niet top 3-scores. U kunt dienovereenkomstig wijzigen.

Raad eens, het antwoord is tien keer eenvoudiger dan de eerste indruk die uw eerste gegevens gaven....

SQLFIDDLE

Vraag naar 1:-- voor top 2 som per gebruiker per dag

SELECT userid, sum(Score), datestamp
FROM scores t1
where 2 >=
(SELECT count(*) 
 from scores t2
 where t1.score <= t2.score
 and t1.userid = t2.userid
 and day(t1.datestamp) = day(t2.datestamp)
 order by t2.score desc)
group by userid, datestamp 
;

Resultaten voor vraag 1:

USERID  SUM(SCORE)  DATESTAMP
1       70      December, 06 2012 00:00:00+0000
1       30      December, 07 2012 00:00:00+0000
2       22      December, 06 2012 00:00:00+0000
2       25      December, 07 2012 00:00:00+0000
3       30      December, 06 2012 00:00:00+0000
3       30      December, 07 2012 00:00:00+0000

Laatste vraag:-- voor alle twee dagen top 2 som per gebruiker

SELECT userid, sum(Score)
FROM scores t1
where 2 >=
(SELECT count(*) 
 from scores t2
 where t1.score <= t2.score
 and t1.userid = t2.userid
 and day(t1.datestamp) = day(t2.datestamp)
 order by t2.score desc)
group by userid
;

Eindresultaten:

USERID  SUM(SCORE)
1      100
2      47
3      60

Hier volgt een momentopname van directe berekeningen van gegevens die ik heb gebruikt.



  1. Beperking gedefinieerd UITSTELBAAR EERST ONMIDDELLIJK is nog steeds UITGESTELD?

  2. Hoe de uitvoer van de opgeslagen procedure terug te sturen naar een variabele in de sql-server

  3. MySQL-database onder versiebeheer zetten?

  4. MySQL - Hoe een willekeurig getal te genereren?