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: