sql >> Databáze >  >> RDS >> PostgreSQL

Výpočet procent odehraných znovu další den

Za předpokladu, že definice tabulky má toto pevné jádro:

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

A za předpokladu, že jste mysleli stejného hráče, který hraje stejnou hru další den:

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;

UNIQUE omezení zajišťuje, že následující den může být pouze jeden zápas. Takže count(*) je správný počet pro den 1 a count(d2.user_id) pro den 2. Zbytek je zřejmý.

UNIQUE omezení (s názvy sloupců v tomto pořadí!) také poskytuje perfektní index pro dotaz. Viz:

Všimněte si, že numerická konstanta 100.0 výchozí hodnota je automaticky numerická, takže nemusíme přidávat žádné přetypování explicitního typu. Související:



  1. Jaké je výchozí heslo pro Postgres

  2. PostgreSQL dotaz je pomalý při použití NOT IN

  3. tabulka je uvedena dvakrát jako cíl pro INSERT i jako samostatný zdroj dat

  4. Rails čekající na migraci v rake db:test:prepare