【问题标题】:SQL Runnnig the same Query multiple timesSQL 多次运行同一个查询
【发布时间】:2015-04-21 04:38:56
【问题描述】:

我有一个查询,它给我两个日期之间的 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

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或完全其他的东西。

标签: sql vertica sqlclient vsql


【解决方案1】:
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

如果字段是日期时间,则使用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 

你必须使用循环并做一些类似上面的事情

【讨论】:

  • 如果日期在表格中不可用,但在该日期显示 0 怎么办?
  • 表示提交的日期不可用.. ?
  • 如果字段是日期时间,则使用转换如果重要,SQL Server 2005 没有 DATE 作为类型。
  • @Backtrack。否。表示在指定范围内的表格中没有可用的日期。假设从日期 A 到日期 C,日期 B 在表格中不可用,但希望显示 0 对日期 B。
  • 在这种情况下添加额外的 if 条件或 Isnull
【解决方案2】:

我将展示我如何使用 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

一旦你有了它,你就可以将整个查询加入到你正在运行的查询中:

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 2015-10-17
    • 2017-06-02
    • 2014-01-28
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多