我的Django应用程序UserMonthScores中有一个表,每个用户每个月都有一个“得分”。所以,它看起来像
userid | month | year | score
-------+-------+------+------
sil | 9 | 2014 | 20
sil | 8 | 2014 | 20
sil | 7 | 2014 | 20
other | 9 | 2014 | 100
other | 8 | 2014 | 1
我想在排名表中找出每个月特定用户所处的位置。所以在上面,如果我每月要求用户“sil”的月度排名位置,我应该得到一个看起来像
的回复month | year | rank
------+------+-----
9 2014 2 # in second position behind user "other" who scored 100
8 2014 1 # in first position ahead user "other" who scored 1
7 2014 1 # in first position because no-one else scored anything!
我在SQL中执行此操作的方法是在月/年将表连接到自身,并选择第二个表用于特定用户的行,第一个表的得分大于第二个表,组按月/年,并选择每月/每年的行数。那就是:
select u1.month,u1.year,count(*) from UserMonthScores u1
inner join UserMonthScores u2
on u1.month=u2.month and u1.year=u2.year
and u2.userid = 'sil' and u1.score >= u2.score
group by u1.year, u1.month;
这非常有效。但是,我不明白如何使用Django ORM进行此查询。关于将表连接到自身还有其他问题,但它们似乎不包括此用例。