sql >> Database teknologi >  >> RDS >> PostgreSQL

Beregner procentdel spillet igen næste dag

Forudsat at tabeldefinitionen har denne solide kerne:

CREATE TABLE game_table (
  user_id   bigint NOT NULL
, date      date   NOT NULL  -- date, not text!
, game_name text   NOT NULL
, UNIQUE (date, game_name, user_id)  -- !
);
 

Og hvis vi antager, at du mente, at den samme spiller spillede det samme spil næste dag:

SELECT round(ct_day2 * 100.0 / ct_day1, 2) AS repeat_percentage FROM ( SELECT count(*) AS ct_day1 , count(d2.user_id) AS ct_day2 FROM instant_game_sessions d1 LEFT JOIN instant_game_sessions d2 ON (d2.user_id, d2.game_name, d2.date) = (d1.user_id, d1.game_name, d1.date + 1) WHERE d1.date = '2021-01-07' AND d1.game_name = 'Chess' ) sub;

Den UNIQUE begrænsning sørger for, at der kun kan være en enkelt kamp den næste dag. Så count(*) er det korrekte antal for dag 1, og count(d2.user_id) for dag 2. Resten er indlysende.

Den UNIQUE constraint (med kolonnenavne i denne rækkefølge!) giver også det perfekte indeks for forespørgslen. Se:

Bemærk, at den numeriske konstant 100.0 standard til numerisk automatisk, så vi behøver ikke tilføje nogen eksplicit type cast. Relateret:



  1. Tillad adgang til Postgresql fra enhver computer

  2. Parse kommasepareret streng for at lave IN Liste over strenge i Where-sætningen

  3. Forskel mellem skema / database i MySQL

  4. Matchende to kolonner