我有一个查询,它给出了两个日期之间的COUNT,start_date& end_date并按各列进行分组。 我有什么方法可以获得每天的COUNT吗?比如说start_date是date1而end_date是date5,所以我需要为' date1到date2',' date1到date3',然后' date1到` date4',然后' date1到date5'。如在基于开始和运行的多次运行相同的查询一样结束日期? 我的查询看起来像
Select COUNT(A), B, C, D
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D
答案 0 :(得分:4)
Select COUNT(A), B, C, D,DATE
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D,DATE
在
组中添加DATE
如果该字段是datetime,则使用convert
(来自@ ta.speot.is:SQL Server 2005没有DATE作为类型)
Select COUNT(A), B, C, D,convert(date,DATETime)
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D,convert(date,DATETime)
在
组中添加DATE
根据OP编辑:
declare increment int;
set increment = 1
declare tempdate date;
set tempdate = start_date
while (tempdate < end_date)
Select COUNT(A), B, C, D,DATE
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND DATEADD(day,increment, start_date )
GROUP BY B, C, D,DATE
set increment = increment + 1
set tempdate = DATEADD(day,1,tempdate )
end
你必须使用循环并执行上面的操作
答案 1 :(得分:1)
我将展示如何通过Oracle实现这一目标,然后如何将其应用于Vertica。
我首先编写一个查询来获取日期列表。像这样:
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as begin_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy') - to_date('01-APR-2015','dd-mon-yyyy')+1;
返回:
01-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM
04-APR-15 12:00:00 AM
05-APR-15 12:00:00 AM
我对Vertica不太熟悉,但看起来这可以通过此查询实现:
SELECT ts::DATE
FROM (SELECT '04/01/2015'::TIMESTAMP as tm
UNION
SELECT '04/05/2015'::TIMESTAMP as tm) as t
TIMESERIES ts as '1 Day' OVER (ORDER BY tm);
(资料来源:http://www.vertica-forums.com/viewtopic.php?t=1333)
然后我使用笛卡尔/交叉连接来创建日期范围:
select *
from (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as begin_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q1, (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as end_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q2
where begin_date <= end_date;
结果如下:
BEGIN_DATE END_DATE
01-APR-15 12:00:00 AM 01-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 02-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 03-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 02-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 03-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM 03-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
04-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
04-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
05-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
如果您不想要单日范围(例如,2015年4月1日 - 2015年4月1日),只需将begin_date&lt; = end_date更改为begin_date&lt; END_DATE。
完成后,您可以将整个查询加入到正在运行的查询中:
Select q.begin_date, q.end_date, t.B, t.C, t.D, count(t.A)
FROM tmp t, (
select *
from (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as begin_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q1, (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as end_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q2
where begin_date <= end_date
) q
where t.theDate between q.begin_date and q.end_date
group by q.begin_date, q.end_date, t.B, t.C, t.D
order by q.begin_date, q.end_date;
这是一个SQLFiddle:http://sqlfiddle.com/#!4/9628d/9
我希望有所帮助。