SQL多次运行同一查询
我有一个查询,它给出两个日期之间的计数,即开始日期和结束日期,并按不同的列进行分组。 有没有办法让我知道每天的计数?比如说开始日期是date1,结束日期是date5,所以我需要对“date1到date2”,“date1到date3”,然后是“date1到date4”,然后是“date1到date5”运行一次查询。与根据开始和结束日期多次运行同一查询一样? 我的问题看起来像SQL多次运行同一查询,sql,vertica,sqlclient,vsql,Sql,Vertica,Sqlclient,Vsql,我有一个查询,它给出两个日期之间的计数,即开始日期和结束日期,并按不同的列进行分组。 有没有办法让我知道每天的计数?比如说开始日期是date1,结束日期是date5,所以我需要对“date1到date2”,“date1到date3”,然后是“date1到date4”,然后是“date1到date5”运行一次查询。与根据开始和结束日期多次运行同一查询一样? 我的问题看起来像 Select COUNT(A), B, C, D FROM TABLE WHERE CONDITION1 AND DATE
Select COUNT(A), B, C, D
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D
在分组依据中添加日期
如果字段是datetime,则使用转换(from@ta.speot.is:SQL Server 2005没有日期作为类型)
在分组依据中添加日期
根据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
声明增量int;
设置增量=1
宣布临时日期;
设置临时日期=开始日期
while(临时日期<结束日期)
选择计数(A)、B、C、D、日期
从桌子上
其中条件1和日期介于开始日期和日期添加之间(天、增量、开始日期)
按B、C、D、日期分组
设置增量=增量+1
set tempdate=DATEADD(天,1,tempdate)
结束
您必须使用循环并执行类似于上面的操作我将展示如何使用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;
我对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);
(来源:)
然后,我对同一查询使用笛卡尔/交叉联接来创建日期范围:
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;
如果您不想要单日范围(例如,2015年4月1日-2015年4月1日),只需更改开始日期。如果表中没有日期,但该日期显示为0,则会发生什么情况?这意味着提交的日期不可用?如果字段是datetime,则使用convert(如果有必要),SQL Server 2005没有日期作为类型。@Backtrack。否。表示表中指定范围内不可用的日期。比如说从日期A到日期C,表中没有日期B,但希望显示相对于日期B的计数0。在这种情况下,添加一个附加的if条件或isNull,这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是
mysql
、postgresql
、sqlserver
、oracle
还是db2
——或者其他完全不同的东西。
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
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);
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
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;