The content discusses hierarchical time series, which are multiple time series organized in a hierarchical structure based on products, geography, or other features. The structure is represented by a summing matrix, which allows for aggregation of the time series at different levels. The need for reconciling forecasts across the hierarchy is highlighted, and three forecast methods are provided: bottom-up, top-down, and optimal combination. These methods involve generating base forecasts and then aggregating or disaggregating them to produce revised forecasts that align with the hierarchical structure.
------

SET SCHEMA DM_PAL;

-- prepare original data table
DROP TABLE ORIGINAL_TAB;
CREATE COLUMN TABLE ORIGINAL_TAB("Series" VARCHAR(100), "TimeStamp" INTEGER, "Original" DOUBLE, "Residual" double);

INSERT INTO ORIGINAL_TAB VALUES('Total',1992,48.74808009,0.058251736);
INSERT INTO ORIGINAL_TAB VALUES('Total',1993,49.48046916,0.236069215);
INSERT INTO ORIGINAL_TAB VALUES('Total',1994,49.93238408,-0.044404927);
INSERT INTO ORIGINAL_TAB VALUES('Total',1995,50.24070241,-0.188001523);
INSERT INTO ORIGINAL_TAB VALUES('Total',1996,50.60846449,-0.128557779);
INSERT INTO ORIGINAL_TAB VALUES('Total',1997,50.84850648,-0.256277857);
INSERT INTO ORIGINAL_TAB VALUES('Total',1998,51.70922002,0.364393685);
INSERT INTO ORIGINAL_TAB VALUES('Total',1999,51.9432984,-0.262241472);
INSERT INTO ORIGINAL_TAB VALUES('Total',2000,52.57795621,0.138337958);
INSERT INTO ORIGINAL_TAB VALUES('Total',2001,53.21495876,0.1406827);
INSERT INTO ORIGINAL_TAB VALUES('A',1992,27.21133833,0.026941198);
INSERT INTO ORIGINAL_TAB VALUES('A',1993,27.83882668,0.35736118);
INSERT INTO ORIGINAL_TAB VALUES('A',1994,28.14534842,0.036394576);
INSERT INTO ORIGINAL_TAB VALUES('A',1995,28.27712455,-0.138351039);
INSERT INTO ORIGINAL_TAB VALUES('A',1996,28.47800096,-0.069250754);
INSERT INTO ORIGINAL_TAB VALUES('A',1997,28.56446636,-0.183661771);
INSERT INTO ORIGINAL_TAB VALUES('A',1998,28.90753332,0.072939797);
INSERT INTO ORIGINAL_TAB VALUES('A',1999,29.02154763,-0.156112852);
INSERT INTO ORIGINAL_TAB VALUES('A',2000,29.40308006,0.111405265);
INSERT INTO ORIGINAL_TAB VALUES('A',2001,29.64248283,-0.030724402);
INSERT INTO ORIGINAL_TAB VALUES('B',1992,21.53674176,0.021310538);
INSERT INTO ORIGINAL_TAB VALUES('B',1993,21.64164248,-0.121291965);
INSERT INTO ORIGINAL_TAB VALUES('B',1994,21.78703566,-0.080799503);
INSERT INTO ORIGINAL_TAB VALUES('B',1995,21.96357786,-0.049650484);
INSERT INTO ORIGINAL_TAB VALUES('B',1996,22.13046352,-0.059307026);
INSERT INTO ORIGINAL_TAB VALUES('B',1997,22.28404012,-0.072616086);
INSERT INTO ORIGINAL_TAB VALUES('B',1998,22.8016867,0.291453889);
INSERT INTO ORIGINAL_TAB VALUES('B',1999,22.92175077,-0.10612862);
INSERT INTO ORIGINAL_TAB VALUES('B',2000,23.17487615,0.026932693);
INSERT INTO ORIGINAL_TAB VALUES('B',2001,23.57247593,0.171407102);
INSERT INTO ORIGINAL_TAB VALUES('AA',1992,7.862669196,0.007719336);
INSERT INTO ORIGINAL_TAB VALUES('AA',1993,8.34035474,0.334355942);
INSERT INTO ORIGINAL_TAB VALUES('AA',1994,8.549132204,0.065447862);
INSERT INTO ORIGINAL_TAB VALUES('AA',1995,8.597698777,-0.094763029);
INSERT INTO ORIGINAL_TAB VALUES('AA',1996,8.770196121,0.029167742);
INSERT INTO ORIGINAL_TAB VALUES('AA',1997,8.837792506,-0.075733217);
INSERT INTO ORIGINAL_TAB VALUES('AA',1998,8.893266655,-0.087855453);
INSERT INTO ORIGINAL_TAB VALUES('AA',1999,8.933993433,-0.102602824);
INSERT INTO ORIGINAL_TAB VALUES('AA',2000,9.133652687,0.056329652);
INSERT INTO ORIGINAL_TAB VALUES('AA',2001,9.152635614,-0.124346675);
INSERT INTO ORIGINAL_TAB VALUES('AB',1992,9.267647091,0.009183739);
INSERT INTO ORIGINAL_TAB VALUES('AB',1993,9.416543734,0.064992652);
INSERT INTO ORIGINAL_TAB VALUES('AB',1994,9.479022166,-0.021425559);
INSERT INTO ORIGINAL_TAB VALUES('AB',1995,9.532376112,-0.030550045);
INSERT INTO ORIGINAL_TAB VALUES('AB',1996,9.54759077,-0.068689333);
INSERT INTO ORIGINAL_TAB VALUES('AB',1997,9.555663663,-0.075831097);
INSERT INTO ORIGINAL_TAB VALUES('AB',1998,9.730346869,0.090779215);
INSERT INTO ORIGINAL_TAB VALUES('AB',1999,9.797293978,-0.016956882);
INSERT INTO ORIGINAL_TAB VALUES('AB',2000,9.921261705,0.040063736);
INSERT INTO ORIGINAL_TAB VALUES('AB',2001,10.02278301,0.017617313);
INSERT INTO ORIGINAL_TAB VALUES('AC',1992,10.08102205,0.010038123);
INSERT INTO ORIGINAL_TAB VALUES('AC',1993,10.08192821,-0.041987414);
INSERT INTO ORIGINAL_TAB VALUES('AC',1994,10.11719405,-0.007627727);
INSERT INTO ORIGINAL_TAB VALUES('AC',1995,10.14704966,-0.013037965);
INSERT INTO ORIGINAL_TAB VALUES('AC',1996,10.16021407,-0.029729163);
INSERT INTO ORIGINAL_TAB VALUES('AC',1997,10.17101019,-0.032097457);
INSERT INTO ORIGINAL_TAB VALUES('AC',1998,10.2839198,0.070016035);
INSERT INTO ORIGINAL_TAB VALUES('AC',1999,10.29026022,-0.036553147);
INSERT INTO ORIGINAL_TAB VALUES('AC',2000,10.34816567,0.015011877);
INSERT INTO ORIGINAL_TAB VALUES('AC',2001,10.46706421,0.07600496);
INSERT INTO ORIGINAL_TAB VALUES('BA',1992,10.49276117,0.010432473);
INSERT INTO ORIGINAL_TAB VALUES('BA',1993,10.51711828,-0.035926057);
INSERT INTO ORIGINAL_TAB VALUES('BA',1994,10.54012728,-0.037274163);
INSERT INTO ORIGINAL_TAB VALUES('BA',1995,10.61219997,0.011789519);
INSERT INTO ORIGINAL_TAB VALUES('BA',1996,10.64931887,-0.023164273);
INSERT INTO ORIGINAL_TAB VALUES('BA',1997,10.7073609,-0.002241141);
INSERT INTO ORIGINAL_TAB VALUES('BA',1998,10.86322633,0.095582262);
INSERT INTO ORIGINAL_TAB VALUES('BA',1999,10.92462763,0.001118138);
INSERT INTO ORIGINAL_TAB VALUES('BA',2000,11.00622388,0.021313074);
INSERT INTO ORIGINAL_TAB VALUES('BA',2001,11.03530969,-0.031197358);
INSERT INTO ORIGINAL_TAB VALUES('BB',1992,11.04398059,0.010878066);
INSERT INTO ORIGINAL_TAB VALUES('BB',1993,11.1245242,-0.085365908);
INSERT INTO ORIGINAL_TAB VALUES('BB',1994,11.24690838,-0.04352534);
INSERT INTO ORIGINAL_TAB VALUES('BB',1995,11.35137789,0.061440003);
INSERT INTO ORIGINAL_TAB VALUES('BB',1996,11.48114466,-0.036142753);
INSERT INTO ORIGINAL_TAB VALUES('BB',1997,11.57667923,-0.10374945);
INSERT INTO ORIGINAL_TAB VALUES('BB',1998,11.93846037,0.195871626);
INSERT INTO ORIGINAL_TAB VALUES('BB',1999,11.99712313,-0.107246758);
INSERT INTO ORIGINAL_TAB VALUES('BB',2000,12.16865227,0.05619619);
INSERT INTO ORIGINAL_TAB VALUES('BB',2001,12.53716625,0.20260446);

-- prepare predict table
DROP TABLE PREDICT_TAB;
CREATE COLUMN TABLE PREDICT_TAB("Series" VARCHAR(100), "TimeStamp" INTEGER, "VALUE" DOUBLE);

INSERT INTO PREDICT_TAB VALUES('Total',2002,54.71127862);
INSERT INTO PREDICT_TAB VALUES('Total',2003,54.20759847);
INSERT INTO PREDICT_TAB VALUES('Total',2004,54.70391832);
INSERT INTO PREDICT_TAB VALUES('Total',2005,55.20023817);
INSERT INTO PREDICT_TAB VALUES('Total',2006,55.69655803);
INSERT INTO PREDICT_TAB VALUES('Total',2007,56.19287788);
INSERT INTO PREDICT_TAB VALUES('A',2002,29.91260999);
INSERT INTO PREDICT_TAB VALUES('A',2003,30.18273716);
INSERT INTO PREDICT_TAB VALUES('A',2004,30.45286433);
INSERT INTO PREDICT_TAB VALUES('A',2005,30.72299149);
INSERT INTO PREDICT_TAB VALUES('A',2006,30.99311866);
INSERT INTO PREDICT_TAB VALUES('A',2007,31.26324583);
INSERT INTO PREDICT_TAB VALUES('B',2002,23.79866862);
INSERT INTO PREDICT_TAB VALUES('B',2003,24.02486131);
INSERT INTO PREDICT_TAB VALUES('B',2004,24.25105399);
INSERT INTO PREDICT_TAB VALUES('B',2005,24.47724668);
INSERT INTO PREDICT_TAB VALUES('B',2006,24.70343937);
INSERT INTO PREDICT_TAB VALUES('B',2007,24.92963205);
INSERT INTO PREDICT_TAB VALUES('AA',2002,9.295965216);
INSERT INTO PREDICT_TAB VALUES('AA',2003,9.439294818);
INSERT INTO PREDICT_TAB VALUES('AA',2004,9.58262442);
INSERT INTO PREDICT_TAB VALUES('AA',2005,9.725954022);
INSERT INTO PREDICT_TAB VALUES('AA',2006,9.869283624);
INSERT INTO PREDICT_TAB VALUES('AA',2007,10.01261323);
INSERT INTO PREDICT_TAB VALUES('AB',2002,10.106687);
INSERT INTO PREDICT_TAB VALUES('AB',2003,10.19059099);
INSERT INTO PREDICT_TAB VALUES('AB',2004,10.27449498);
INSERT INTO PREDICT_TAB VALUES('AB',2005,10.35839897);
INSERT INTO PREDICT_TAB VALUES('AB',2006,10.44230296);
INSERT INTO PREDICT_TAB VALUES('AB',2007,10.52620695);
INSERT INTO PREDICT_TAB VALUES('AC',2002,10.50995778);
INSERT INTO PREDICT_TAB VALUES('AC',2003,10.55285135);
INSERT INTO PREDICT_TAB VALUES('AC',2004,10.59574493);
INSERT INTO PREDICT_TAB VALUES('AC',2005,10.6386385);
INSERT INTO PREDICT_TAB VALUES('AC',2006,10.68153207);
INSERT INTO PREDICT_TAB VALUES('AC',2007,10.72442565);
INSERT INTO PREDICT_TAB VALUES('BA',2002,11.09559286);
INSERT INTO PREDICT_TAB VALUES('BA',2003,11.15587602);
INSERT INTO PREDICT_TAB VALUES('BA',2004,11.21615919);
INSERT INTO PREDICT_TAB VALUES('BA',2005,11.27644236);
INSERT INTO PREDICT_TAB VALUES('BA',2006,11.33672553);
INSERT INTO PREDICT_TAB VALUES('BA',2007,11.3970087);
INSERT INTO PREDICT_TAB VALUES('BB',2002,12.70307577);
INSERT INTO PREDICT_TAB VALUES('BB',2003,12.96898528);
INSERT INTO PREDICT_TAB VALUES('BB',2004,12.9348948);
INSERT INTO PREDICT_TAB VALUES('BB',2005,13.20080432);
INSERT INTO PREDICT_TAB VALUES('BB',2006,13.36671384);
INSERT INTO PREDICT_TAB VALUES('BB',2007,14.13262335);


-- prepare structure table
DROP TABLE STRUCTURE_TAB;
CREATE COLUMN TABLE STRUCTURE_TAB("Index" INTEGER, "Series" VARCHAR(100), "NUM" INTEGER);

INSERT INTO STRUCTURE_TAB VALUES(1,'Total',2);
INSERT INTO STRUCTURE_TAB VALUES(2,'A',3);
INSERT INTO STRUCTURE_TAB VALUES(3,'B',2);
INSERT INTO STRUCTURE_TAB VALUES(4,'AA',0);
INSERT INTO STRUCTURE_TAB VALUES(5,'AB',0);
INSERT INTO STRUCTURE_TAB VALUES(6,'AC',0);
INSERT INTO STRUCTURE_TAB VALUES(7,'BA',0);
INSERT INTO STRUCTURE_TAB VALUES(8,'BB',0);

-- prepare parameter
DROP TABLE PALHTS_TBL;
CREATE COLUMN TABLE PAL_PARAMETER_HTS_TBL(
       "PARAM_NAME" NVARCHAR(256), 
       "INT_VALUE" INTEGER, 
       "DOUBLE_VALUE" DOUBLE, 
       "STRING_VALUE" NVARCHAR(1000)
);
-- 0: optimal combination; 1: bottom-up; 2: top-down
INSERT INTO PAL_PARAMETER_HTS_TBL VALUES ('METHOD', 0, null,null);

-- 0: ols; 1: MinT; 2: wls. this parameter only valid when METHOD is 0.
INSERT INTO PAL_PARAMETER_HTS_TBL VALUES ('WEIGHTS', 1, null,null);

DROP TABLE PAL_HF_RESULT;
CREATE COLUMN TABLE PAL_HF_RESULT("Series" VARCHAR(100), "TimeStamp" INTEGER, "Value" DOUBLE);


DROP TABLE PAL_HF_STATISTIC;
CREATE COLUMN TABLE PAL_HF_STATISTIC(
       "NAME" NVARCHAR(256), 
       "VALUE" NVARCHAR(1000)
);


DO BEGIN
	lt_original = SELECT * FROM ORIGINAL_TAB;
	lt_predict  = SELECT * FROM PREDICT_TAB;
	lt_structure = SELECT * FROM STRUCTURE_TAB;
	lt_para      = SELECT * FROM PAL_PARAMETER_HTS_TBL;
	CALL _SYS_AFL.PAL_HIERARCHICAL_FORECAST(:lt_original, :lt_predict, :lt_structure, :lt_para, lt_result, lt_statistic);
	INSERT INTO PAL_HF_RESULT SELECT * FROM :lt_result;
	INSERT INTO PAL_HF_STATISTIC SELECT * FROM :lt_statistic;
END;

	SELECT * FROM PAL_HF_RESULT;
	SELECT * FROM PAL_HF_STATISTIC;
