2011-09-30 158 views
4

有人可以帮助我找出一组日期范围吗?SQL如何按日期范围分组

现在我有查询与此类似

Select date, count(x) 
    from data 
    group by date 

这返回的结果是这样的

2011/1/1 10 
    2011/1/2 5 
    2011/1/3 8 
    2011/1/4 3 

等等

但我想,每2天算使数据看起来像这样

2011/1/1 15 
    2011/1/3 11 

任何想法??

感谢

+2

你如何确定哪两个日子过起来呢?为什么1/1和1/2,而不是1/2和1/3,比如? – mellamokb

回答

2

你可以通过转换为数字整数值,并减少偶数正常化的日期为2组。一个简单的方法是val/2 * 2,因为第一个/ 2将被截断任何小数位(只要val的类型是一个整数!),* 2将返回原始值,除了归一化为偶数。这里是标准化和团体使用CTE数据源的结果的例子:

;with Data as ( 
    select '1/1/2011' as [date], 1 as x union 
    select '1/1/2011' as [date], 2 as x union 
    select '1/1/2011' as [date], 3 as x union 
    select '1/1/2011' as [date], 4 as x union 
    select '1/1/2011' as [date], 5 as x union 
    select '1/1/2011' as [date], 6 as x union 
    select '1/1/2011' as [date], 7 as x union 
    select '1/1/2011' as [date], 8 as x union 
    select '1/1/2011' as [date], 9 as x union 
    select '1/1/2011' as [date], 10 as x union 
    select '1/2/2011' as [date], 11 as x union 
    select '1/2/2011' as [date], 12 as x union 
    select '1/2/2011' as [date], 13 as x union 
    select '1/2/2011' as [date], 14 as x union 
    select '1/2/2011' as [date], 15 as x union 
    select '1/3/2011' as [date], 16 as x union 
    select '1/3/2011' as [date], 17 as x union 
    select '1/3/2011' as [date], 18 as x union 
    select '1/3/2011' as [date], 19 as x union 
    select '1/3/2011' as [date], 20 as x union 
    select '1/3/2011' as [date], 21 as x union 
    select '1/3/2011' as [date], 22 as x union 
    select '1/3/2011' as [date], 23 as x union 
    select '1/4/2011' as [date], 24 as x union 
    select '1/4/2011' as [date], 25 as x union 
    select '1/4/2011' as [date], 26 as x 
) 
Select 
    cast(cast(cast(Date as datetime) as integer)/2 * 2 as datetime) as date, 
    count(x) 
from data 
group by cast(cast(Date as datetime) as integer)/2 * 2 

输出:

date     (No column name) 
2011-01-01 00:00:00.000 15 
2011-01-03 00:00:00.000 11 
1
Select floor((date - trunc(date,'MM'))/2), count(x) 
    from data 
group by floor((date - trunc(date,'MM'))/2)