-1

我在表中有四列称为记录,比如score,event_id,user_id,我想根据用户ID +事件ID 总结记录的得分,然后我会喜欢显示按Score排序的不同事件的用户。根据不同的列对记录组进行排序

所以我wriiten下面的代码

Recording.select("user_id,event_id,sum(score) as score").group(:user_id,:event_id).order("score DESC") 

和上面的查询输出基于最高分的记录,如下面

#<Recording user_id: 4, event_id: 51, score: 64622>, 
#<Recording user_id: 3, event_id: 51, score: 5912> 
#<Recording user_id: 4, event_id: 31, score: 62>, 
#<Recording user_id: 3, event_id: 48, score: 0> 

但我想重新太分钟得分arrabge结果如下所示(不同事件的用户按Score排序)

#<Recording user_id: 4, event_id: 51, score: 64622>, 
#<Recording user_id: 4, event_id: 31, score: 62>, 
#<Recording user_id: 3, event_id: 48, score: 0>, 
#<Recording user_id: 3, event_id: 51, score: 5912> 
+0

我有两列编组的记录,USER_ID和EVENT_ID – loganathan 2013-05-06 21:01:26

+0

这个问题是非常不清楚。你的例子很难说明你的文本没有描述什么。荣誉@PinnyM似乎已经在更多的评论后发现了它。 – 2013-05-06 23:45:42

回答

1

对于PostgreSQL,哟ü可以使用窗口函数来做到这一点:

select_sql <<-SELECT 
    user_id, event_id, sum(score) as score, 
    ROW_NUMBER() OVER (PARTITION BY user_id, event_id ORDER BY sum(score) DESC) as rowNum 
SELECT 

subquery = Recording.select(select_sql).group(:user_id, :event_id).to_sql 

Recording.select("*").from(Arel.sql("(#{subquery}) t")). 
      order("rowNum, score DESC") 
+0

我不想根据event_id和score对记录进行排序,我想根据每个事件的得分重新排列记录。 赞好belwo – loganathan 2013-05-06 21:03:15

+0

你认为不是从高到低得分(64622,5912,62,52)?你想用什么其他逻辑来订购分数? – PinnyM 2013-05-06 21:07:19

+0

我想按每个事件的最高分将记录重新整理到最低分,而不仅仅是分数。如果我们有三个事件,那么输出必须像前3个记录必须具有每个事件的前3个最大值,并且后3个记录必须具有每个事件的后3个最大分数。 – loganathan 2013-05-06 21:11:58

相关问题