Oracle SQL中的累积用例语句

时间:2019-06-09 12:45:56

标签: sql oracle

我有一个简单的数据

BaseUser

我想按周对数据进行分组,并且总和应该是累积的。日期从3月8日开始,因此仅应以这种方式计算周。所以结果应该是

 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  

尝试使用累加和求和,但无法实现

2 个答案:

答案 0 :(得分:2)

您可以生成您的周范围,然后使用外部联接查看适合每个星期的数据,并使用分析和获得所需的结果;

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天中的两个...

db<>fiddle

答案 1 :(得分:1)

这是一个选择;请注意,“我的周”与您的不同,因为-您的数据从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>