2015-01-19 4 views
0

Мне нужно показать последний график трендов на 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 недели.

+1

Unrelated, но: 'из (выберите * из kpi_thresholds)' бесполезно, вы можете просто сделать 'от kpi_thresholds' –

+0

Есть '' 12 -JAN-14 16: 30: 13'' для обеих дат опечатка? Вы не включаете 2015 год. Вам нужны результаты, которые всегда начинаются в начале недели или просто хотят вернуться 7 * 15 дней? –

+0

@a_horse_with_no_name - мне нужно вернуться 7 * 15 дней –

ответ

0

Если вам не нужны даты, выровненные с «недельных границ» это становится довольно просто:

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

Обратите внимание, что это не будет возвращать строки с kpi_date от 2014-09-29 до того 16: 30

Это можно записать немного короче в Oracle

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

Просто небольшое примечание: если 'kpi_date' является типом' DATE', используя литералы ANSI 'timestamp', подобные этому, неявно * превращают это в' where cast (kpi_date как временная метка) между меткой времени ... ', которая может дать вам нежелательное полное сканирование таблицы. Может быть, больше набирать текст 'to_date (...)', но он может использовать индекс, если он есть ;-) –

0

Поскольку вы используете to_char(kpi_date, 'IW') последние 15 недели будут иметь значения 40, 41, ..., 53, 1, 2. И ваше предложение where запрашивает у тех, у кого значение недели между -13 и 2.

Вместо группы и заказа trunc(kpi_date, 'IW'), который будет включать год. В элементе select вы можете сделать to_char по значению усеченной даты, чтобы получить то, что вам нужно. В SQL ниже я использую 'IYYY-IW', чтобы показать вам результаты, если вам нужен только номер недели, вы можете просто использовать 'IW' в to_char.

А затем в вашем предложении 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; 
Смежные вопросы