2014-02-25 63 views
0

我有一個Placements表,每月跟蹤員工和他們的積分。如何從多個月獲得第一筆記錄

我正在努力解決如何讓員工在每個月的第一時間完成任務。

我已經試過這樣的事情

create_table "placements", :force => true do |t| 
t.integer "employee_id" 
t.date  "month" 
t.integer "points" 
end 

@previous_winners = @placements.includes(:employee).order('points DESC').first 

我想我可能會通過所有月份需要循環?

+0

* first place *的意思是? –

+0

對不起,當它應該是'點DESC'時,我已經命令'months DESC'。所以第一個地方會記錄大多數點 – grabury

+0

(0..11).inject([]){| sum,m | sum << Placement.where(month:m).order('points DESC')。first} month indexes are now as array:January = 0,so winner winner = @placements [0] – dennis

回答

1

'GROUP BY'在PostgreSQL中的作用與MySQL中的不同。你所尋找的是導軌/紅寶石等同於以下SQL表達式:

SELECT DISTINCT ON (month) month,points, employee_id 
FROM placements 
order by month, points DESC 

在軌控制,你可以使用上面:

@placements.select('DISTINCT ON (month) month, points, employee_id').where('YOUR_CONDITION').order('month, points DESC') 

這僅僅是一個例子如何分組在PostgreSQL中,迎合您的需求。

PS:'DISTINCT ON'是這裏的訣竅:)

0

您可以使用類似的東西來獲得比上月

from = Time.now.beginning_of_month - 1.month 
to = from.end_of_month 

然後給您查詢,您可以添加他們。

@previous_winners = @placements.includes(:employee).where('month BETWEEN ? AND ?', from, to).order('points DESC').first 
1

您可以使用group按月對最高分數進行分組。像這樣的東西應該工作:

@previous_winners = @placements.includes(:employee).group(:month). 
    order('points DESC').map(&:employee) 

該查詢返回的位置每月的最高點值,包括相關聯的員工,那麼,map函數返回每條記錄的員工。

這個答案的前提是,每個月的位置記錄具有完全相同的日期

[編輯]

這個答案不上的Postgres在所有的工作,我不認爲它實際上返回在MySQL的正確結果!這裏是一個應該工作(但會運行每個月DB查詢)略有kludgey版本

@previous_winners = @placements.distinct.pluck(:month).map do |month| 
    @placements.includes(:employee).where(:month => month). 
    order('points DESC').first.employee 
end 

Here作爲如果有人想玩弄它

在問題描述的架構的SQL小提琴
+0

This looks right。雖然我收到了postgresql group_by錯誤。我沒有在問題中包括這個,所以當我找出錯誤並確認它有效時,我會標記正確 – grabury

+0

我會在聲明的結尾添加.first第一句嗎? – grabury

+0

這隻會給你第一個月的贏家 – Slicedpan

相關問題