Oracle: Over Partition Не работает при указании столбца - PullRequest
0 голосов
/ 08 мая 2020

У меня есть следующие данные

VEHICLE        DATE      INCIDENTS       SERVICE       AVG_NO
 x50        01/01/2020        2             1             20
 X50        09/01/2020        1             0             20

Я планирую создать столбец для инцидентов и услуг, в котором будет собрана сумма всех инцидентов и услуг за последние (AVG_NO) дней

SELECT VEHICLE, DATE, 
SUM(INCIDENTS) over (partition by VEHICLE order by DATE rows between AVG_NO preceding and current row) as SUM_INCIDENTS,
SUM(SERVICE) over (partition by VEHICLE order by DATE rows between AVG_NO preceding and current row) as SUM_SERVICE
from TBL

Но проблема с приведенным выше сценарием заключается в том, что over и partition by не работают. Если я укажу номер вместо AVG_NO, он будет работать.

SELECT VEHICLE, DATE, 
SUM(INCIDENTS) over (partition by VEHICLE order by DATE rows between 20 preceding and current row) as SUM_INCIDENTS,
SUM(SERVICE) over (partition by VEHICLE order by DATE rows between 20 preceding and current row) as SUM_SERVICE
from TBL

Можете ли вы сказать мне, что я делаю не так и как это исправить?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Пожалуйста, проверьте, есть ли AVG_NO > 0 или вы можете сделать его 1, если это 0.

SELECT VEHICLE, DATE, 
SUM(INCIDENTS) over (partition by VEHICLE order by DATE rows between decode(AVG_NO,0,1,AVG_NO) preceding 
and current row) as SUM_INCIDENTS,
SUM(SERVICE) over (partition by VEHICLE order by DATE rows between decode(AVG_NO,0,1,AVG_NO) preceding 
and 
current row) as SUM_SERVICE
from TBL;
0 голосов
/ 08 мая 2020

Трудно отладить «это не работает», если вы не объясните что не работает.

Глядя на то, что вы опубликовали, и если вы используете Oracle (поскольку вы его отметили), то DATE - недопустимое имя столбца, поскольку оно зарезервировано для типа данных. Если это исправлено (вместо этого я использовал datum имя столбца), запрос возвращает что-то :

SQL> with test (vehicle, datum, incidents, service, avg_no) as
  2    (select 'x50', date '2020-01-01', 2, 1, 20 from dual union all
  3     select 'x50', date '2020-01-09', 1, 0, 20 from dual
  4    )
  5  select vehicle, datum,
  6    sum(incidents) over (partition by vehicle order by datum
  7                         rows between avg_no preceding and current row
  8                        ) as sum_incidents,
  9    sum(service)   over (partition by vehicle order by datum
 10                         rows between avg_no preceding and current row
 11                        ) as sum_service
 12  from test;

VEH DATUM      SUM_INCIDENTS SUM_SERVICE
--- ---------- ------------- -----------
x50 01.01.2020             2           1
x50 09.01.2020             3           1

SQL>

Я не знаю, хотите ли вы этого, но это не сработало. .

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