我需要显示最近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周。
答案 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;