DjangoでRANK, ROW_NUMBERを使う方法

RANK, ROW_NUMBERが使えそうな記述があったので、試行錯誤してできました!

RANK,ROW_NUMBERを使う方法

from django.db.models.functions.window import Rank, RowNumber
from django.db.models import F, Window

rankings = Hoge.objects.order_by('count').annotate(
    hoge_rank=Window(expression=Rank(),
    order_by='count')).reverse()

実行するとこんな感じの、SQLがつきます。

RANK() OVER(ORDER BY count) as `hoge_rank`

annotateで指定した引数名でasが付きます。

こんな感じでアクセスできる

for ranking in rankings:
    print(ranking.hoge_rank)

RANK, ROW_NUMBERをDESCにする

F関数をかませてdesc関数を呼び出す感じでできます。ascもこれでできるので基本こっちのがいい
F('count').desc()

rankings = Hoge.objects.order_by('count').annotate(
    hoge_rank=Window(expression=Rank(),
    order_by=F('count').desc())).reverse()

Djangoさんサンプルがないとここまでたどり着くの大変よ。

他にも、CUME_DIST DENSE_RANK, FIRST_VALUE, LAG, LAST_VALUE, LEAD, NTH_VALUE, NTILE, PERCENT_RANK, が使えるみたいです!

https://docs.djangoproject.com/en/4.1/ref/models/expressions/#using-f-to-sort-null-values
https://docs.djangoproject.com/en/4.1/ref/models/database-functions/#rownumber

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です