sql >> Database >  >> RDS >> PostgreSQL

Berekening van het gespeelde percentage de volgende dag

Ervan uitgaande dat de tabeldefinitie deze solide kern heeft:

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)  -- !
);

En ervan uitgaande dat je dezelfde speler bedoelde die de volgende dag hetzelfde spel speelt:

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;

De UNIQUE beperking zorgt ervoor dat er de volgende dag maar één wedstrijd kan zijn. Dus count(*) is de juiste telling voor dag 1, en count(d2.user_id) voor dag 2. De rest is duidelijk.

De UNIQUE constraint (met kolomnamen in deze volgorde!) biedt ook de perfecte index voor de query. Zie:

Merk op dat de numerieke constante 100.0 standaard automatisch numeriek, dus we hoeven geen expliciete typecast toe te voegen. Gerelateerd:



  1. Alleen tijd bijwerken vanuit mijn Datetime-veld in sql

  2. Hoe de auto-increment primaire sleutelwaarde in MySQL te krijgen met behulp van Hibernate

  3. Open SQL Developer vanaf de opdrachtregel met parameters (connectstring, gebruiker, wachtwoord...)

  4. MIN() versus LEAST() in MySQL:wat is het verschil?