检索两年内的每周值

retrieve weekly values over a period of two years

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

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;

查询 return 正确的结果,但仅适用于 2015 年秋季的那几周(即只有 2 周),但我需要显示过去 15 周的值,我也需要考虑 2014 周.

如果您不需要与 "week boundaries" 对齐的日期,这就变得非常简单:

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

请注意,这不会 return 从 2014-09-29 之前 16:30

带有 kpi_date 的行

这在 Oracle 中可以写得更短一些

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

由于您使用的是 to_char(kpi_date, 'IW') 最后 15 周的值将是 40、41、...、53、1、2。并且您的 where 子句要求那些周值介于 -13 和 2 之间的值.

改为按 trunc(kpi_date, 'IW') 分组和排序,其中将包括年份。在 select 中,您可以对截断的日期值执行 to_char 以获得所需的内容。在下面的SQL中我用'IYYY-IW'给大家看结果,如果你只需要周数,你可以在to_char中用'IW'

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

由于我没有得到一些测试数据,这是未尝试过的代码:

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;