Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Create a Statistics table based on a historical data table

Filipe RBSep 4 2019 — edited Oct 12 2019

With Oracle 18C

I would like to create a statistics table for some fields existing on the historical table

Given a date as starting point the query should create all the statistics for the dates bigger than the date provided

The data used to calculate the statistics is based on all records with a date older than the one being analyzed.

For example if we are analyzing the date 2019-08-17 all the records older than this date should be taken for statistics calculation.

Before starting to provide some solution, please first ask any questions about any information that I forgot to mention

Below you can see some representation of what is required.

Create_Stats_Table.png

Table Definition

CREATE TABLE HISTORY (

"DDATE" DATE,

"N1" NUMBER(2, 0),

"N2" NUMBER(2, 0),

"N3" NUMBER(2, 0),

"N4" NUMBER(2, 0),

"N5" NUMBER(2, 0),

"N6" NUMBER(2, 0)

)

Insert Statement

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-27 00:00:00','YYYY-MM-DD HH24:MI:SS'),1,2,34,38,44,48);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-23 00:00:00','YYYY-MM-DD HH24:MI:SS'),1,8,19,22,41,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-18 00:00:00','YYYY-MM-DD HH24:MI:SS'),2,4,15,17,44,49);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-18 00:00:00','YYYY-MM-DD HH24:MI:SS'),2,8,13,15,21,27);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-09 00:00:00','YYYY-MM-DD HH24:MI:SS'),3,5,13,19,25,26);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-27 00:00:00','YYYY-MM-DD HH24:MI:SS'),3,6,8,19,20,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-22 00:00:00','YYYY-MM-DD HH24:MI:SS'),3,22,35,36,41,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-17 00:00:00','YYYY-MM-DD HH24:MI:SS'),5,6,8,24,35,45);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-29 00:00:00','YYYY-MM-DD HH24:MI:SS'),5,10,11,15,23,31);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-04 00:00:00','YYYY-MM-DD HH24:MI:SS'),6,9,10,18,31,38);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-30 00:00:00','YYYY-MM-DD HH24:MI:SS'),7,8,13,16,28,41);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-15 00:00:00','YYYY-MM-DD HH24:MI:SS'),7,21,23,26,43,44);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-08 00:00:00','YYYY-MM-DD HH24:MI:SS'),8,9,12,30,33,49);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),9,13,25,28,40,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-15 00:00:00','YYYY-MM-DD HH24:MI:SS'),10,12,15,20,21,30);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-27 00:00:00','YYYY-MM-DD HH24:MI:SS'),11,12,14,30,37,40);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-24 00:00:00','YYYY-MM-DD HH24:MI:SS'),13,18,23,27,40,48);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-10 00:00:00','YYYY-MM-DD HH24:MI:SS'),14,17,26,35,39,46);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-06 00:00:00','YYYY-MM-DD HH24:MI:SS'),14,19,33,38,39,41);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-06 00:00:00','YYYY-MM-DD HH24:MI:SS'),15,19,34,40,42,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2222-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),9,9,9,9,9,9);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),13,20,31,34,40,45);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-06 00:00:00','YYYY-MM-DD HH24:MI:SS'),1,9,11,23,42,46);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-11 00:00:00','YYYY-MM-DD HH24:MI:SS'),7,11,12,32,34,48);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),9,21,36,37,39,40);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-20 00:00:00','YYYY-MM-DD HH24:MI:SS'),5,9,20,27,31,46);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-06-25 00:00:00','YYYY-MM-DD HH24:MI:SS'),9,14,18,25,33,40);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-02 00:00:00','YYYY-MM-DD HH24:MI:SS'),3,18,29,40,42,46);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-04 00:00:00','YYYY-MM-DD HH24:MI:SS'),8,24,27,30,36,46);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-11 00:00:00','YYYY-MM-DD HH24:MI:SS'),4,6,11,23,40,49);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-16 00:00:00','YYYY-MM-DD HH24:MI:SS'),1,5,10,15,27,30);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-25 00:00:00','YYYY-MM-DD HH24:MI:SS'),5,10,13,16,18,27);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),1,5,11,14,15,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-03 00:00:00','YYYY-MM-DD HH24:MI:SS'),1,18,23,29,38,42);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-08 00:00:00','YYYY-MM-DD HH24:MI:SS'),4,5,9,27,35,45);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),3,10,14,31,47,49);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-19 00:00:00','YYYY-MM-DD HH24:MI:SS'),9,15,19,22,29,35);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-22 00:00:00','YYYY-MM-DD HH24:MI:SS'),7,12,20,26,28,44);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-08-29 00:00:00','YYYY-MM-DD HH24:MI:SS'),8,16,22,25,36,43);

Insert into HISTORY (DDATE,N1,N2,N3,N4,N5,N6) values (to_date('2019-07-20 00:00:00','YYYY-MM-DD HH24:MI:SS'),11,16,20,25,31,40);

I started the SQL statement to implement what I am describing above, this might help you to understand better

  SELECT DISTCALC.MAX\_DATE  ANALISYS\_DATE

        ,N1    

        ,MAX(DISTCALC.DDATE) LASTDRAW    

        ,CFIELD\_REP    

        ,MIN(ABS(DISTCALC.distance)) MinDist    

        ,ROUND(MEDIAN(DISTCALC.distance)-STDDEV\_POP(DISTCALC.distance)) LOWER\_LIMIT    

        ,ROUND(MEDIAN(DISTCALC.distance)) DistMedian    

        ,ROUND(MEDIAN(DISTCALC.distance)+STDDEV\_POP(DISTCALC.distance)) HIGHER\_LIMIT    

        ,MAX(DISTCALC.distance) MaxDist    

  FROM (SELECT  MAX(t.DDATE) OVER() MAX\_DATE

              ,t.DDATE

              ,t.N1

              ,count(\*) over (partition by N1) CFIELD\_REP

              ,NVL(t.DDATE -lag (t.DDATE) over (partition by N1 order by t.DDATE ASC), 0) Distance

        FROM HISTORY t

        WHERE t.DDATE \< TO\_DATE('2019-08-29','YYYY-MM-DD')

        ORDER BY DDATE DESC) DISTCALC    

  WHERE DISTCALC.distance > 0    

  OR (DISTCALC.DDATE = DISTCALC.MAX\_DATE AND DISTCALC.distance = 0)    

  OR (DISTCALC.CFIELD\_REP = 1 AND DISTCALC.distance = 0)    

  GROUP BY N1,CFIELD\_REP, DISTCALC.MAX\_DATE;
This post has been answered by Stew Ashton on Sep 8 2019
Jump to Answer
Comments
Post Details
Added on Sep 4 2019
30 comments
814 views