gpt4 book ai didi

MySql 按日期范围获取总和

转载 作者:可可西里 更新时间:2023-11-01 08:35:31 26 4
gpt4 key购买 nike

这是一些用于存储广告事件预算历史记录的表格:

campaign_budgets_history

id_campaign  budget date
1 10 2013-01-01
1 15 2013-01-03
1 10 2013-01-05

如果某个日期没有数据,则等于上次设置的预算。

如何按日期范围计算预算总和,例如从“2013-01-02”到“2013-01-06”。结果必须是 60 美元,因为“2013-01-02”的预算等于“2013-01-01”,而“2013-01-04”的预算等于“2013-01-03” '.

有什么办法可以通过 SQL 实现吗?

最佳答案

这是一个问题。它使用用户变量来表示查询范围的末端,但在最终版本中,您可能更愿意使用参数占位符。请注意,@end 是您查询的范围之后的第一天,即它是范围的唯一端。

SET @begin = '2013-01-02';
SET @end = '2013-01-07';

SELECT
SUM(DATEDIFF(IF(CAST(c.end AS date) > CAST(@end AS date),
CAST(@end AS date),
CAST(c.end AS date)
),
IF(c.begin < CAST(@begin AS date),
CAST(@begin AS date),
c.begin
)
) * c.budget
) AS overall_budget
FROM
(SELECT a.id_campaign,
a.date begin,
MIN(IFNULL(b.date, CAST(@end AS date))) end,
a.budget
FROM campaign_budgets_history a
LEFT JOIN campaign_budgets_history b
ON a.id_campaign = b.id_campaign AND a.date < b.date
WHERE a.date < CAST(@end AS date)
GROUP BY a.id_campaign, a.date
HAVING end > CAST(@begin AS date)
) c;

测试于 SQL Fiddle .不确定为什么所有类型转换似乎都是必要的,也许有一种方法可以避免其中的一些。但是上面的方法似乎有效,而一些转换较少的版本没有。

想法是子查询创建一个范围表,每个范围表示给定预算生效的日期。您可能必须调整第一个范围的开头,以匹配查询范围的开头。然后,您只需减去日期以获得每个日期的天数,然后将该数字乘以每日预算。

关于MySql 按日期范围获取总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com