2013-06-01 4 views
2

Я хотел бы создать представление, которое возвращает месяцы суммарного количества осадков. Каждая строка, возвращаемая представлением, будет представлять месяц для данного года.Динамический пробег всего

В представлении я хотел бы включить столбец, который является совокупным дождем в течение года, так что в январе для января будет общий дождик для января этого года. Строки для февраля будут иметь общий итог дождя за Jan+Feb того года, ряды для Мар будут иметь общий итог дождя за Jan+Feb+Mar ... и так далее до декабря декабря будет общий дождь в течение года.

Жесткая часть Я хотел был бы иметь возможность запросить представление на конкретную дату ex. «select * from vw_rain_stats where rain_date >= to_date('2010-MAR-01')», а суммарный итоговый столбец должен начинаться с месяца, указанного в предложении where (март), а не в январе.

Я не хочу, чтобы ежемесячные дожди дождя до 2010 года-MAR-01 включались в данные, возвращаемые представлением.

Я могу разработать представление, которое накапливает amts в течение всего года, но я не могу понять, как разработать представление, чтобы оно могло начать накапливать amts в течение месяца, отличного от января.

Учитывая, что данные за январь 2012 года по февраль 2013 года в базовой таблице и за каждый месяц в этот период времени есть дождь (без нулевого дождя mths).

create table rain_stats (rain_date date, amt number); 

insert into rain_stats values ('2012-JAN-01', 50); 
insert into rain_stats values ('2012-FEB-01', 10); 
insert into rain_stats values ('2012-MAR-01', 20); 
insert into rain_stats values ('2012-APR-01', 40); 
insert into rain_stats values ('2012-MAY-01', 30); 
insert into rain_stats values ('2012-JUN-01', 10); 
insert into rain_stats values ('2012-JUL-01', 4); 
insert into rain_stats values ('2012-AUG-01', 100); 
insert into rain_stats values ('2012-SEP-01', 5); 
insert into rain_stats values ('2012-OCT-01', 100); 
insert into rain_stats values ('2012-NOV-01', 90); 
insert into rain_stats values ('2012-DEC-01', 80); 
insert into rain_stats values ('2013-JAN-01', 30); 
insert into rain_stats values ('2013-FEB-01', 7); 

Пользователь выполняет этот запрос

select * from vw_rain_stats where rain_date >= '2012-MAY-01'

Это результат, который возвращается;

 
|   RAIN_DATE | AMT | RUNNING_AMT | 
------------------------------------------ 
|  May, 01 2012 | 30 |   30 | 
|  Jun, 01 2012 | 10 |   40 | 
|  Jul, 01 2012 | 4 |   44 | 
|  Aug, 01 2012 | 100 |   144 | 
|  Sep, 01 2012 | 5 |   149 | 
|  Oct, 01 2012 | 100 |   249 | 
|  Nov, 01 2012 | 90 |   339 | 
|  Dec, 01 2011 | 80 |   419 | 
|  Jan, 01 2013 | 30 |   30 | 
|  Feb, 01 2013 | 70 |   100 | 
| .................. | ... | ........... | 

Обратите внимание, что дождь АМТС за январь-апрель 2012 года не включены в результирующем или в running_amt кумулятивных значений. Это то, что я хочу.

+0

Можете ли вы добавить быстрый образец формата таблицы и желаемого результата? –

ответ

3

ОБНОВЛЕНО Вы ищете это?

CREATE VIEW vw_rain_stats 
AS 
    SELECT TRUNC(rain_date, 'MM') rain_date, 
     SUM(amt) amt 
    FROM rain_stats 
    GROUP BY TRUNC(rain_date, 'MM') 
; 

Получить ежемесячные суммы за 2012 год

SELECT rain_date, 
     amt, 
     SUM(amt) OVER (ORDER BY rain_date) running_amt 
    FROM vw_rain_stats 
WHERE rain_date BETWEEN '01-JAN-12' AND '01-DEC-12'; 

получают ежемесячные суммы, начиная с декабря 2011 года

SELECT rain_date, 
     amt, 
     SUM(amt) OVER (ORDER BY rain_date) running_amt 
    FROM vw_rain_stats 
WHERE rain_date >= '01-DEC-11'; 

Пример вывода:

|   RAIN_DATE | AMT | RUNNING_AMT | 
------------------------------------------ 
| December, 01 2011 | 80 |   80 | 
| January, 01 2012 | 30 |   110 | 
| February, 01 2012 | 70 |   180 | 
| March, 01 2012 | 110 |   290 | 
| .................. | ... | ........... | 

Вот SQLFiddle demo

+0

@ DarcyDommer Обновленный ответ и sqlfiddle. Вы можете выбрать любой интервал времени с таким подходом. – peterm

+0

Спасибо, что посмотрели на это. У вас есть правильная идея, но я хочу, чтобы реализация суммы находилась в определении представления. Я не хочу, чтобы пользователь должен был знать эту часть. Запрос вида должен быть таким же простым, как «select rain_date, amt, running_amt из vw_rain_stats, где rain_date> = '01 -MAR-2012» « –

+0

Так что вы, вероятно, захотите, чтобы хранимая процедура передавала переменную даты в запрос выше, который ссылается вид. –

0

Я не уверен, что я точно следую за вами, но это похоже на ситуацию, когда вам нужна функция Window.Если добавить это к вашему мнению:

SUM(Rain_Amt) OVER (ORDER BY rain_date) AS cum_Rain 

Вы можете получить кумулятивные осадки, начиная с любой даты, путем вычитания кумулятивного количества осадков даты начала с каждой последующей даты, что-то вроде:

SELECT *, cum_Rain - (SELECT cum_Rain FROM vw_rain_stats WHERE rain_date = '20070405') 
FROM vw_rain_stats 
WHERE rain_date >= '20070405' 
+0

Спасибо. у вас есть правильная идея, но я пытаюсь понять, как поместить всю реализацию суммирования в определение представления. Все, что я хочу, чтобы пользователь должен был сделать, это указать дату. Учитывая эту дату, представление вернет результирующий набор, отсортированный по году и месяцу. Он должен начать накапливать дождевые фильтры из первой строки (или месяца) в наборе результатов и сбросить накопление после первой строки Dec. Затем начните накапливать снова и снова для каждой строки до следующей строки Dec. и так далее ... –

0

Позвольте мне предположить, что у вас есть базовая таблица RainDays, которая составляет суточные дожди.

Можно было бы подумать, что вы хотите следующий вид:

create view vw_RainMonths as 
    select yyyymm, RainMonth, 
      sum(RainMonth) over (order by yyyymm) as cum 
    from (select to_char(RainDate as 'YYYY-MM') as yyyymm, sum(Rain) as RainMonth 
      from RainDays 
      group by to_char(RainDate as 'YYYY-MM') 
     ) t 

Однако, это не работает, потому что (как вы подозреваете) он накапливает значения с начала времени. Для этих данных применяется предложение where.

Oracle поддерживает табличные функции, параметризованные представления и конвейерные функции таблицы - все они могут действовать как представление и применение значения в аргументе. К сожалению, ни один из них не столь чист, как один вид. Они требуют создания нового типа данных для возвращаемого значения.

+0

Да. Есть ли способ получить аналитику суммы после применения предложения where? –

+0

@ DarcyDommer. , , В принципе, есть способы, но они не так просто, как добавление представления. –

+0

Я думал, что смогу добраться туда, где захочу, с помощью окон и разделов, а также с комбинацией суммы, отставания, предшествующей, следующей, текущей строки. Но не повезло. –

Смежные вопросы