quot; COLUMNS ( department_id INT PATH "$.department_id" ) ) AS jt2 WHERE jt2.department_id = jt.department_id) AS retention_rate FROM members AS m JOIN JSON_TABLE( m.custom_keys, "quot; COLUMNS ( department_id INT PATH "$.department_id" ) ) AS jt GROUP BY jt.department_id, years_of_service ORDER BY jt.department_id, years_of_service; ``` ### キャッシュテーブル - [[キャッシュテーブル]] ```sql CREATE TABLE retention_rate_cache ( department_id INT, years_of_service INT, total_members INT, retention_rate DECIMAL(5, 2), last_updated TIMESTAMP, PRIMARY KEY (department_id, years_of_service) ); ``` ```sql -- キャッシュテーブルのデータを一度削除 DELETE FROM retention_rate_cache; -- 新しい集計データをキャッシュテーブルに挿入 INSERT INTO retention_rate_cache (department_id, years_of_service, total_members, retention_rate, last_updated) SELECT jt.department_id, TIMESTAMPDIFF(YEAR, m.entry_date, CURDATE()) AS years_of_service, COUNT(*) AS total_members, COUNT(*) / (SELECT COUNT(*) FROM members AS m2 JOIN JSON_TABLE( m2.custom_keys, "quot; COLUMNS ( department_id INT PATH "$.department_id" ) ) AS jt2 WHERE jt2.department_id = jt.department_id) AS retention_rate, NOW() AS last_updated FROM members AS m JOIN JSON_TABLE( m.custom_keys, "quot; COLUMNS ( department_id INT PATH "$.department_id" ) ) AS jt GROUP BY jt.department_id, years_of_service; ``` ```sql SELECT department_id, years_of_service, retention_rate FROM retention_rate_cache WHERE department_id = 10; -- 特定のdepartment_idの定着率を取得 ```