前提・実現したいこと
pythonからpostgresqlのDBにpsycopg2でアクセスし、以下のテーブルから以下の情報を取得したい。その際に必要なSQL文が知りたい。またSQL文の実行は1回で行いたい。
指定した区間内の指定選手no(player_no)の順位(rank)が2位以上(1位または2位)の割合(rate)を取得したい。ただし、指定した区間に該当する選手の情報がない場合はNULL(pycopg2で取得した場合はNone)にしたい。
例)
game | player_no | date | rank |
---|---|---|---|
1 | 1 | 2020-01-01 00:00:00.000000 | 3 |
1 | 2 | 2020-01-01 00:00:00.000000 | 1 |
1 | 3 | 2020-01-01 00:00:00.000000 | 2 |
2 | 1 | 2020-01-02 00:00:00.000000 | 1 |
2 | 4 | 2020-01-02 00:00:00.000000 | 2 |
2 | 6 | 2020-01-02 00:00:00.000000 | 4 |
2 | 10 | 2020-01-02 00:00:00.000000 | 3 |
3 | 1 | 2020-01-03 00:00:00.000000 | 3 |
3 | 7 | 2020-01-03 00:00:00.000000 | 2 |
3 | 8 | 2020-01-03 00:00:00.000000 | 1 |
3 | 9 | 2020-01-03 00:00:00.000000 | 4 |
3 | 11 | 2020-01-03 00:00:00.000000 | 5 |
指定した区間:2020-01-01 00:00:00から2020-01-02 23:59:59
指定した選手no:1,2,3,5,6,9,10,11
取得したいデータ
player_no | rate |
---|---|
1 | 50% |
2 | 100% |
3 | 0% |
5 | NULL |
6 | 0% |
9 | NULL |
10 | 0% |
11 | NULL |
該当のソースコード
python3
1import psycopg2 2 3# 以下は適宜設定 4user_name = "" 5password = "" 6host_name = "" 7port = "" 8database = "" 9 10def execute_sql(sql): 11 dsn = "postgresql://{}:{}@{}:{}/{}".format(user_name, password, host_name, port, database) 12 with psycopg2.connect(dsn) as conn: 13 with conn.cursor() as cur: 14 cur.execute(sql) 15 value = [] 16 for row in cur: 17 value.append(row) 18 return value 19 20 21# CREATE,INSERT用 22def execute_sql_no_result(sql): 23 dsn = "postgresql://{}:{}@{}:{}/{}".format(user_name, password, host_name, port, database) 24 with psycopg2.connect(dsn) as conn: 25 with conn.cursor() as cur: 26 cur.execute(sql) 27 28# テストデータ作成 29execute_sql_no_result("DROP TABLE IF EXISTS test") 30execute_sql_no_result("CREATE TABLE test (game INTEGER,player_no INTEGER,date timestamp,rank INTEGER);") 31execute_sql_no_result("INSERT INTO test VALUES ('1','1','2020/1/1 0:00:00','3');") 32execute_sql_no_result("INSERT INTO test VALUES ('1','2','2020/1/1 0:00:00','1');") 33execute_sql_no_result("INSERT INTO test VALUES ('1','3','2020/1/1 0:00:00','2');") 34execute_sql_no_result("INSERT INTO test VALUES ('2','1','2020/1/2 0:00:00','1');") 35execute_sql_no_result("INSERT INTO test VALUES ('2','4','2020/1/2 0:00:00','2');") 36execute_sql_no_result("INSERT INTO test VALUES ('2','6','2020/1/2 0:00:00','4');") 37execute_sql_no_result("INSERT INTO test VALUES ('2','10','2020/1/2 0:00:00','3');") 38execute_sql_no_result("INSERT INTO test VALUES ('3','1','2020/1/3 0:00:00','3');") 39execute_sql_no_result("INSERT INTO test VALUES ('3','7','2020/1/3 0:00:00','2');") 40execute_sql_no_result("INSERT INTO test VALUES ('3','8','2020/1/3 0:00:00','1');") 41execute_sql_no_result("INSERT INTO test VALUES ('3','9','2020/1/3 0:00:00','4');") 42execute_sql_no_result("INSERT INTO test VALUES ('3','11','2020/1/3 0:00:00','5');") 43 44execute_sql("ここのSQL文が知りたいです") 45
試したこと
検索したが解決策をうまく見つけることができなかった。
補足情報(FW/ツールのバージョンなど)
Python 3.6.2
psycopg2 2.8.5
PostgreSQL 12.2
その他
簡単な説明も頂けると嬉しいです。
あなたの回答
tips
プレビュー