计数量,

计数量,

问题描述:

假设我有以下记录的表: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中可能吗?

+0

应为a的值是5,而不是6? – Stobor

+0

对不起,你是对的,我在修改例子时犯了一个错误 – konewka

一个可能的解决方案涉及构建一个包含所有情况的所有可能日期的“参考表”。 (例如,你可以在未来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 
+0

然而这并不完全如我所愿,我想统计不同日期的数量。所以想象我有两条记录:2017-08-10 23:00' - '2017-08-10 23:01'和'2017-08-12 11:00 - 2017-08-12 11:01',我想要这些计为两天,就像两个记录“2017-08-10 01:00 - 2017-08-10 23:00”和“2017-08-12 02:00 - 2017-08-12 22: 00' – konewka

+0

在这种情况下,类别a的结果不应该是5吗?是26/9,27/9,6/10,7/10和8/10 ?? – Adam92