データサイエンス100本ノックで勉強(17)集計関数 RANK()とROW_NUMBER()

データサイエンス100本ノックでSQLPythonを勉強していきます。

github.com

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;

f:id:JunpeiNakasone:20220207070532p:plain

RANK()を使うと同じamountに同じrankingを付与しています。

同様のSQLでRANK()ではなくROW_NUMBER()を使うと同じamountに一意のrankingを付与します。 f:id:JunpeiNakasone:20220207071401p:plain

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)

f:id:JunpeiNakasone:20220207070615p:plain