データサイエンス100本ノックでSQLとPythonを勉強していきます。
S-019: レシート明細テーブル(receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。
SQLだと以下のようになります。
%%sql SELECT customer_id, amount, RANK() OVER(ORDER BY amount DESC) AS ranking FROM receipt LIMIT 10;
RANK()を使うと同じamountに同じrankingを付与しています。
同様のSQLでRANK()ではなくROW_NUMBER()を使うと同じamountに一意のrankingを付与します。
Pythonだと以下のようになります。
df_tmp = pd.concat([df_receipt[['customer_id','amount']] ,df_receipt['amount'].rank(method='min', ascending=False)], axis=1) df_tmp.columns = ['customer_id','amount','ranking'] df_tmp.sort_values('ranking', ascending=True).head(10)