[英]SQL logic for More than 1 event date with at least 1 month between those event dates
[英]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;
我為PostgreSQL提供了一個更新的sqlfiddle。 你的原始版似乎適用於MySQL。
generate_series()
為每個事件每天創建一行。 COALESCE
來處理NULL
值,這似乎是允許的ends_at
。 starts_at
和ends_at
+ 1
之間的天數來計算daily
成本, starts_at
ends_at
修復。 如果ends_at IS NULL
默認為1。 瞧。
您甚至可以獲得每月的確切費率,具體取決於每月的天數。 2月(28天)比1月(31天)便宜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.