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