кумулятивный оператор использования в SQL Oracle - PullRequest
0 голосов
/ 09 июня 2019

У меня есть простые данные

 Date      Count by english     count by chinese  

 08-Mar-19        12             54       
 09-Mar-19        15             66  
10-Mar-19         45             32  
11-Mar-19         21             70  
12-Mar-19         57             64  
29-Mar-19         43             53  
30-Mar-19         67             21  

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

                     count by english         count by chinese  
 08-MAR-19-14-MAR-19     150                   286    
 15-MAR-19-22-MAR-19     150                   286  (no data so same as above)                                                                                                                                                                                 
 23-MAR-19-30-MAR-19     260                   360  

Пробовал с использованием кумулятивного и суммированного, но не смог его достичь

Ответы [ 2 ]

2 голосов
/ 09 июня 2019

Вы можете сгенерировать диапазоны своей недели, затем использовать внешнее объединение, чтобы увидеть, какие данные соответствуют каждой неделе, и использовать аналитическую сумму, чтобы получить желаемый результат;

with week_ranges (date_from, date_to) as (
  select min_date + ((level - 1) * 7), min_date + (level * 7)
  from (
    select min(some_date) as min_date, ceil((max(some_date) - min(some_date)) / 7) as weeks
    from your_table
  )
  connect by level <= weeks
)
select distinct wr.date_from, wr.date_to - 1 as date_to,
  sum(count_english) over (order by wr.date_from) as count_english,
  sum(count_chinese) over (order by wr.date_from) as count_chinese
from week_ranges wr
left join your_table yt
on yt.some_date >= wr.date_from
and yt.some_date < wr.date_to
order by date_from;

, который с вашими данными выборкиполучает:

DATE_FROM  DATE_TO    COUNT_ENGLISH COUNT_CHINESE
---------- ---------- ------------- -------------
2019-03-08 2019-03-14           150           286
2019-03-15 2019-03-21           150           286
2019-03-22 2019-03-28           150           286
2019-03-29 2019-04-04           260           360

Обратите внимание, что это делит его на четыре 7-дневные недели, а не на одну из 7 дней и две из 8 дней ...

дБ <>скрипка

1 голос
/ 09 июня 2019

Вот один из вариантов;обратите внимание, что «мои недели» отличаются от ваших, потому что ваши данные несколько противоречивы, так как они варьируются от 6 до 7 дней.Вот почему конечный результат отличается, но общая идея должна быть в порядке.

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> with test (datum, cbe) as
  2    -- sample data
  3    (select date '2019-03-08', 12 from dual union all
  4     select date '2019-03-09', 15 from dual union all
  5     select date '2019-03-10', 45 from dual union all
  6     select date '2019-03-11', 21 from dual union all
  7     select date '2019-03-12', 57 from dual union all
  8     select date '2019-03-29', 43 from dual union all
  9     select date '2019-03-30', 67 from dual
 10    ),
 11  span as
 12    -- min and max date value, so that we could create a "calendar"
 13    (select min(datum) mindat,
 14            max(datum) maxdat
 15     from test
 16    ),
 17  periods as
 18    -- "calendar" whose periods are weeks
 19    (select s.mindat + (level - 1) * 7 datum_from,
 20           (s.mindat + level * 7) - 1  datum_to
 21     from span s
 22     connect by level <= (s.maxdat - s.mindat) / 7 + 1
 23    )
 24  -- running sum per weeks
 25  select distinct
 26         p.datum_from,
 27         p.datum_to,
 28         sum(t.cbe) over (order by p.datum_from) sum_cbe
 29  from test t full outer join periods p on t.datum between p.datum_from and p.datum_to
 30  order by p.datum_from;

DATUM_FROM DATUM_TO      SUM_CBE
---------- ---------- ----------
08.03.2019 14.03.2019        150
15.03.2019 21.03.2019        150
22.03.2019 28.03.2019        150
29.03.2019 04.04.2019        260

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