Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL多次运行同一查询_Sql_Vertica_Sqlclient_Vsql - Fatal编程技术网

SQL多次运行同一查询

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

我有一个查询,它给出两个日期之间的计数,即开始日期和结束日期,并按不同的列进行分组。 有没有办法让我知道每天的计数?比如说开始日期是date1,结束日期是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
在分组依据中添加日期

如果字段是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;