sql >> Base de Datos >  >> RDS >> PostgreSQL

Cálculo del porcentaje reproducido de nuevo al día siguiente

Asumiendo que la definición de la tabla tiene este núcleo sólido:

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

Y suponiendo que te refieres al mismo jugador jugando el mismo juego al día siguiente:

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;

El UNIQUE La restricción se asegura de que solo pueda haber una única coincidencia al día siguiente. Entonces count(*) es el recuento correcto para el día 1 y count(d2.user_id) para el día 2. El resto es obvio.

El UNIQUE La restricción (¡con los nombres de las columnas en este orden!) también proporciona el índice perfecto para la consulta. Ver:

Tenga en cuenta que la constante numérica 100.0 el valor predeterminado es numérico automáticamente, por lo que no es necesario agregar ningún tipo de conversión explícito. Relacionado: