DROP TABLE FURGONI;
DROP TABLE VIAGGI;
DROP TABLE TAPPE;

CREATE TABLE FURGONI (
	Targa	 CHAR(10) NOT NULL PRIMARY KEY,
	Sede	 VARCHAR(20) NOT NULL 		);

CREATE TABLE VIAGGI (
	IDV	 CHAR(6) NOT NULL PRIMARY KEY,
	Targa	 CHAR(10) NOT NULL REFERENCES FURGONI,
	Data	 DATE 	NOT NULL,
	KmTotali INT	NOT NULL CHECK (KmTotali > 0)		);

CREATE TABLE TAPPE (
	IDV	 CHAR(6) NOT NULL REFERENCES VIAGGI,
	Num	 INT NOT NULL CHECK (Num >= 0),
	Km 	 INT NOT NULL CHECK (Km >= 0),
	PRIMARY KEY (IDV,Num)		);

INSERT INTO FURGONI VALUES
('EC123CD','Bologna'),
('FF412CG','Modena'),
('FB481HJ','Modena');

INSERT INTO VIAGGI VALUES
('V19012','EC123CD','27.10.2019',250),
('V19014','EC123CD','25.11.2019',832),
('V20002','EC123CD','04.01.2020',265),
('V20003','EC123CD','07.01.2020',915),
--
('V19013','FF412CG','18.11.2019',972),
('V20007','FF412CG','13.01.2020',517),
--
('V20001','FB481HJ','03.01.2020',430),
('V20006','FB481HJ','12.01.2020',615)
;

INSERT INTO TAPPE VALUES
('V19012',0,0),
('V19012',1,250),
--
('V19014',0,0),
('V19014',1,260),
('V19014',2,630),
('V19014',3,832),
--
('V20002',0,0),
('V20002',1,265),
--
('V20003',0,0),
('V20003',1,340),
('V20003',2,520),
('V20003',3,915),
--
('V19013',0,0),
('V19013',1,520),
('V19013',2,972),
--
('V20007',0,0),
('V20007',1,222),
('V20007',2,517),
--
('V20001',0,0),
('V20001',1,430),
--
('V20006',0,0),
('V20006',1,333),
('V20006',2,615)
;

GRANT SELECT ON FURGONI TO PUBLIC;
GRANT SELECT ON VIAGGI TO PUBLIC;
GRANT SELECT ON TAPPE TO PUBLIC;


-- 2.1
WITH 
VIAGGI_PER_FASCIA (Targa,Fascia,NumViaggi) AS (
	SELECT   V.Targa, V.KmTotali/400, COUNT(*)
	FROM	 VIAGGI V
	GROUP BY V.Targa, V.KmTotali/400
	)
SELECT 	VF.Fascia*400 || '--' || (VF.Fascia+1)*400 - 1 AS Fascia, VF.Targa
FROM 	VIAGGI_PER_FASCIA VF
WHERE	VF.NumViaggi = 	( SELECT MAX(VF1.NumViaggi)
			  FROM	VIAGGI_PER_FASCIA VF1
			  WHERE	VF1.Fascia = VF.Fascia );


-- 2.2
WITH 
LUNGHEZZA_TAPPE (IDV,Lung) AS (
	SELECT   TP.IDV, TA.Km - TP.Km
	FROM	 TAPPE TP, TAPPE TA
	WHERE	 TP.IDV = TA.IDV
	AND	 TP.Num = TA.Num - 1
	AND	 EXISTS ( SELECT *
			  FROM   TAPPE T
			  WHERE  T.IDV = TP.IDV
			  AND    T.Num > 1	)
	)
SELECT LT.*
FROM   LUNGHEZZA_TAPPE LT
WHERE  LT.Lung >= ALL ( SELECT LT1.Lung
	      		FROM   LUNGHEZZA_TAPPE LT1
	      		WHERE  LT1.IDV = LT.IDV    );

