sql >> Databasteknik >  >> RDS >> PostgreSQL

Beräknar procent som spelas igen nästa dag

Förutsatt att tabelldefinitionen har denna solida kärna:

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

Och antar att du menade samma spelare som spelar samma spel nästa 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 ser till att det bara kan bli en enda match nästa dag. Så count(*) är det korrekta antalet för dag 1 och count(d2.user_id) för dag 2. Resten är uppenbart.

Den UNIQUE constraint (med kolumnnamn i denna ordning!) ger också det perfekta indexet för frågan. Se:

Observera att numerisk konstant 100.0 standard till numerisk automatiskt, så vi behöver inte lägga till någon explicit typ cast. Relaterat:



  1. Problem med att skapa .MDF-fil från Visual Studio 2010

  2. Robust metod för att skapa SQL-frågor programmatiskt

  3. Hur man skapar en tabell med utländsk nyckelbegränsning i SQL Server - SQL Server / TSQL självstudie del 66

  4. Hur laddar din Oracle ODBC-drivrutin Oracle-klienten?