簡體   English   中英

事件范圍超過一個月時,按月累計事件成本(在rails 3中)

[英]Aggregate Event cost by month when Event ranges more than one month (in rails 3)

我有這個Event模型

class Event < ActiveRecord::Base
  attr_accessible :starts_at, :ends_at, :price
end

一個Event可以是一個即時事件:

Event.create(:starts_at => Date.today, :ends_at=>nil, :price => 10.0)

它也可以跨越多天或幾個月:

Event.create(:starts_at => Date.today, :ends_at => (Date.today + 2.months), :price => 20.0)

我希望將事件的成本按月分解,以便即時事件的成本自然地落入其所屬的月份,並且跨越多個月的事件的成本應該在這些月份之間按比例分配。

顯然使用SQL會很難處理,但也許有人對此有一些建議?

計算此聚合的最有效方法是什么?

更新:

這是一個明確定義的sqlfiddle數據結構: http ://sqlfiddle.com/#!12 / a532e / 6

我想從這個數據集中得到的是:

( (Date('2013-01-01'), 31.6), (Date('2013-02-01'), 8.4) )
SELECT event_id
      ,date_trunc('month', day)::date AS month
      ,sum(daily) AS price_this_month
FROM  (
   SELECT event_id
         ,generate_series(starts_at
                         ,COALESCE(ends_at, starts_at)
                         ,interval '1 day') AS day
         ,price / COALESCE((ends_at - starts_at) + 1, 1) AS daily
   FROM   events
   ) a
GROUP  BY 1,2
ORDER  BY 1,2;

- > sqlfiddle

我為PostgreSQL提供了一個更新的sqlfiddle。 你的原始版似乎適用於MySQL。

技巧是:

  • 使用generate_series()為每個事件每天創建一行。
  • 使用COALESCE來處理NULL值,這似乎是允許的ends_at
  • 通過將price除以starts_atends_at + 1之間的天數來計算daily成本, starts_at ends_at修復。 如果ends_at IS NULL默認為1。
  • 每個事件和月份重新聚合。

瞧。

您甚至可以獲得每月的確切費率,具體取決於每月的天數。 2月(28天)比1月(31天)便宜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM