根据不同的列对记录组进行排序
我在表中有四列称为记录,比如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>
对于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")
我不想根据event_id和score对记录进行排序,我想根据每个事件的得分重新排列记录。 赞好belwo – loganathan 2013-05-06 21:03:15
你认为不是从高到低得分(64622,5912,62,52)?你想用什么其他逻辑来订购分数? – PinnyM 2013-05-06 21:07:19
我想按每个事件的最高分将记录重新整理到最低分,而不仅仅是分数。如果我们有三个事件,那么输出必须像前3个记录必须具有每个事件的前3个最大值,并且后3个记录必须具有每个事件的后3个最大分数。 – loganathan 2013-05-06 21:11:58
我有两列编组的记录,USER_ID和EVENT_ID – loganathan 2013-05-06 21:01:26
这个问题是非常不清楚。你的例子很难说明你的文本没有描述什么。荣誉@PinnyM似乎已经在更多的评论后发现了它。 – 2013-05-06 23:45:42