前提・実現したいこと
下図右側のようなTableがあるとき、ユーザ名を指定してselectを行い、左側のようなTableを得たいです。
その時、次の仕様を満たしたいです。
- 当日4時からその次の日3時59分59秒を同日として扱う。
例えば2020-05-26 04:00:00 ~ 2020-05-27 03:59:59 を同日として扱う。
- 同じ日付なら、ユーザ名の重複を除外する。このとき、得点が最も高い行のみを残し、他を除外する。
- 同じ得点・同じユーザ名・同日の列が複数ある場合は、そのうち一つだけを残す。
- 日別のランキングを列として得る。
上記はサンプルですが、実際の列の件数は10万件程度、ユーザ数は5000程度、1日当たりの列数は1000件程度を想定しています。
実行時間は1s以下に抑えたいです。
補足情報(FW/ツールのバージョンなど)
SQLite3を利用しています。
サンプル作成に使ったSQL文は以下の通りです。
SQL
1create table Scoreboard (id INTEGER PRIMARY KEY AUTOINCREMENT,user_name TEXT NOT NULL, score INTEGER NOT NULL ,time_stamp TEXT NOT NULL); 2insert into Scoreboard(user_name, score,time_stamp) values ("A",10,"2020-05-26 19:00:00"); 3insert into Scoreboard(user_name, score,time_stamp) values ("B",5,"2020-05-26 21:00:00"); 4insert into Scoreboard(user_name, score,time_stamp) values ("C",20,"2020-05-27 03:05:00"); 5insert into Scoreboard(user_name, score,time_stamp) values ("A",15,"2020-05-27 03:00:00"); 6insert into Scoreboard(user_name, score,time_stamp) values ("A",20,"2020-05-27 04:00:00"); 7insert into Scoreboard(user_name, score,time_stamp) values ("A",5,"2020-05-27 03:59:59"); 8insert into Scoreboard(user_name, score,time_stamp) values ("B",20,"2020-05-28 01:00:00"); 9insert into Scoreboard(user_name, score,time_stamp) values ("B",20,"2020-05-28 12:00:00"); 10insert into Scoreboard(user_name, score,time_stamp) values ("C",20,"2020-05-28 18:00:00"); 11insert into Scoreboard(user_name, score,time_stamp) values ("A",1,"2020-06-23 04:00:00");
ユーザ名のTableはありません。
回答1件
あなたの回答
tips
プレビュー