计数量,
问题描述:
假设我有以下记录的表:SQL Fiddle计数量,
| category | begin | end |
|----------|---------------------|---------------------|
| a | 2017-09-26 08:00:00 | 2017-09-27 10:00:00 |
| b | 2017-10-02 13:00:00 | 2017-10-03 07:00:00 |
| a | 2017-10-06 02:00:00 | 2017-10-06 09:00:00 |
| a | 2017-10-06 11:00:00 | 2017-10-06 14:00:00 |
| a | 2017-10-06 19:00:00 | 2017-10-08 10:00:00 |
我希望能够计算的每个类别不同天的总量(以间开始,结束)。因此:类别a包含10月26日至27日和10月6日至8日(10月6日出现在多个记录中)的时间段,而类别b只有10月2日至3日的时间段。我想因此得到以下结果:
| category | days |
|----------|------|
| a | 5 |
| b | 2 |
从一些GROUP BY category
声明。 (My)SQL中可能吗?
答
一个可能的解决方案涉及构建一个包含所有情况的所有可能日期的“参考表”。 (例如,你可以在未来20年,过去20年。)对于这个sqlfiddle,我刚刚填补了必要的日子。我创建ref_dates
与单个日期列day
,并用于以下SQL:
select category,
count(distinct day)
from times
inner join ref_dates
on cast(begin as date) <= day
and day <= cast(end as date)
group by category;
答
如果他们都重叠(如在您的示例数据),你可以使用:
select category, datediff(min(begin), max(end))
from t
group by category;
如果有差距,这个问题是非常困难。
+0
没有的确,记录不一定重叠,让我在我的示例数据中修复这个 – konewka
答
我会使用timestampdiff并利用一个简单的总和。这将计算分钟差异的总和,然后按需要进行转换。
select category,
sum(timestampdiff(minute, begin,end)) as 'diff'
from times
group by category
应为a的值是5,而不是6? – Stobor
对不起,你是对的,我在修改例子时犯了一个错误 – konewka