PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tính toán phần trăm chơi lại vào ngày hôm sau

Giả sử định nghĩa bảng có cốt lõi vững chắc này:

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

Và giả sử ý bạn là cùng một người chơi chơi cùng một trò chơi vào ngày hôm sau:

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 ràng buộc đảm bảo rằng chỉ có thể có một trận đấu duy nhất vào ngày hôm sau. Vì vậy, count(*) là số lượng chính xác cho ngày 1 và số lượng count(d2.user_id) cho ngày thứ 2. Phần còn lại là hiển nhiên.

UNIQUE ràng buộc (với các tên cột theo thứ tự này!) cũng cung cấp chỉ mục hoàn hảo cho truy vấn. Xem:

Lưu ý rằng hằng số 100.0 mặc định tự động thành số, vì vậy chúng tôi không cần thêm bất kỳ kiểu ép kiểu rõ ràng nào. Có liên quan:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. datagrip Không thể áp dụng các thay đổi Bảng này chỉ được đọc. Không thể áp dụng các thay đổi của trình chỉnh sửa ô

  2. Cách thêm bộ chứa docker vào mạng docker hiện có

  3. Kết nối postgresql với sqlalchemy

  4. PostgreSQL:.psql_history thành / dev / null

  5. Lỗi Nhập:Không tìm thấy biểu tượng:_PQencryptPasswordConn nghĩa là gì và làm cách nào để khắc phục?