Django ORM:将表连接到自身并聚合

时间:2014-09-03 13:15:39

标签: django orm self-join

我的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进行此查询。关于将表连接到自身还有其他问题,但它们似乎不包括此用例。

0 个答案:

没有答案