在两年内检索每周价值

时间:2015-01-19 10:55:09

标签: sql oracle

我需要显示最近15周的趋势图,我正在查询每天存储值的表格。我使用以下查询:

select avg(kpi_values),to_char(kpi_date, 'IW') 
  from (select * from kpi_thresholds)
 where KPI_NAME='SEARCH_KPI' 
   and to_number(to_char(kpi_date, 'IW')) 
       between 
       to_number(to_char(to_date('12-JAN-15 16:30:13','DD-MM-YYYY HH24:MI:SS'), 'IW'))-15 
       and 
       to_number(to_char(to_date('12-JAN-15 16:30:13','DD-MM-YYYY HH24:MI:SS'), 'IW')) 
 group 
    by to_char(kpi_date, 'IW') order by to_char(kpi_date, 'IW') asc;

查询返回正确的结果,但仅适用于2015年的周(即仅2周),但我需要显示最近15周的值,我需要考虑2014周。

2 个答案:

答案 0 :(得分:0)

如果您不需要与“周边界”对齐的日期,则变得非常简单:

where kpi_date between 
          timestamp '2015-01-12 16:30:00' - interval '7' day * 15
      and timestamp '2015-01-12 16:30:00'

请注意,这不会在 16:30之前从2014-09-29 返回带有kpi_date的行

这可以在Oracle中写得更短

where kpi_date between 
          timestamp '2015-01-12 16:30:00' - 7 * 15
      and timestamp '2015-01-12 16:30:00'

答案 1 :(得分:0)

由于您使用to_char(kpi_date, 'IW'),过去15周的值将为40,41,...,53,1,2。并且您的where子句会询问周值介于-13和2之间的人。 / p>

而是按trunc(kpi_date, 'IW')分组和排序,其中包括年份。在选择中,您可以对截断的日期值执行to_char以获得所需内容。在下面的SQL中,我使用'IYYY-IW'向您显示结果,如果您只需要周数,则可以在'IW'中使用to_char

然后在您的where子句中,不要在用于谓词的列上使用函数(这通常会阻止优化器使用索引),而是计算&gt的开始和结束日期值; =和<。

由于我没有测试数据,这是未经验证的代码:

select avg(kpi_values)
     , to_char(trunc(kpi_date, 'IW'), 'IYYY-IW') 
  from kpi_thresholds
 where KPI_NAME='SEARCH_KPI' 
   and kpi_date >= trunc(to_date('12-JAN-15 16:30:13','DD-MM-YYYY HH24:MI:SS'), 'IW') - 15*7
   and kpi_date <  trunc(to_date('12-JAN-15 16:30:13','DD-MM-YYYY HH24:MI:SS'), 'IW') + 7
 group by trunc(kpi_date, 'IW')
 order by trunc(kpi_date, 'IW') asc;