表格结构
期望结果
回答
使用connect by level
获取十二个月资料使用ADD_MONTHS将目前时间(sysdate)-(level+3)跟(level-1)取得连续四个月资料使用group + avg 取得平均资料with CTE as ( select --使用ADD_MONTHS-3跟-1取得连续四个月资料 TO_DATE(TO_CHAR( ADD_MONTHS(sysdate ,- (level+3)),'YYYY/MM/')||'01','yyyy/mm/dd') sDate ,TO_DATE(TO_CHAR( ADD_MONTHS(sysdate ,- level),'YYYY/MM/')||'01','yyyy/mm/dd') eDate ,level from dual --使用`connect by level`获取十二个月资料 connect by level <=12 ),CTE2 as ( select * from CTE T1 left join T T2 on cast(T2."Month" as date) between T1.sDate and T1.eDate)select TO_CHAR(sDate,'MM/YY') || ' - ' || TO_CHAR(eDate,'MM/YY') as "Consecutive Months" ,round(avg("Consumption")) as "Avg. of 4 Months Consumption"from CTE2group by sDate,eDateorder by eDate
得到结果
Test DDL:
CREATE TABLE T ("Month" timestamp, "Consumption" int);INSERT ALL INTO T ("Month", "Consumption") VALUES ('01-Apr-2017 12:00:00 AM', 10000) INTO T ("Month", "Consumption") VALUES ('01-May-2017 12:00:00 AM', 10000) INTO T ("Month", "Consumption") VALUES ('01-Jun-2017 12:00:00 AM', 10000) INTO T ("Month", "Consumption") VALUES ('01-Jul-2017 12:00:00 AM', 13000) INTO T ("Month", "Consumption") VALUES ('01-Aug-2017 12:00:00 AM', 11000) INTO T ("Month", "Consumption") VALUES ('01-Sep-2017 12:00:00 AM', 12000) INTO T ("Month", "Consumption") VALUES ('01-Oct-2017 12:00:00 AM', 10000) INTO T ("Month", "Consumption") VALUES ('01-Nov-2017 12:00:00 AM', 12000)SELECT * FROM dual;
线上测试连结
假如大大们有更好做法,都可以留言讨论。