PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Obliczanie procentu zagranego ponownie następnego dnia

Zakładając, że definicja tabeli ma ten solidny rdzeń:

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

I zakładając, że miałeś na myśli tego samego gracza, grającego w tę samą grę następnego dnia:

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 ograniczenie zapewnia, że ​​następnego dnia może być tylko jeden mecz. Więc count(*) to poprawna liczba dla dnia 1, a count(d2.user_id) na dzień 2. Reszta jest oczywista.

UNIQUE ograniczenie (z nazwami kolumn w tej kolejności!) zapewnia również doskonały indeks dla zapytania. Zobacz:

Zauważ, że stała numeryczna 100.0 domyślnie jest to numeryczne, więc nie musimy dodawać żadnego jawnego rzutowania typu. Powiązane:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Która jest bardziej wydajna smallint czy character(10)?

  2. Dlaczego najlepiej przechowywać numer telefonu jako ciąg, a nie jako liczbę całkowitą?

  3. Jak zautomatyzować wdrażanie bazy danych PostgreSQL

  4. 2. kwadrant na PostgresConf US 2018

  5. Lumen - Utwórz połączenie z bazą danych w czasie wykonywania