*******************************************************************************
* R TEMPORAL LEFT OUTER JOIN P ON DUR(R.T) BETWEEN min AND max
*******************************************************************************

WITH R AS (SELECT Ts Us, Te Ue, * FROM R),
     P AS (SELECT Ts Vs, Te Ve, * FROM P)
SELECT n , a, min, max, r.Ts, r.Te
FROM (R ALIGN P ON DUR(Us,Ue) BETWEEN Min AND Max WITH (ts,te,ts,te)) r
     LEFT OUTER JOIN
     (P ALIGN R ON DUR(Us,Ue) BETWEEN Min AND Max WITH (ts,te,ts,te)) p
     ON DUR(Us,Ue) BETWEEN Min AND Max AND
        r.Ts=p.Ts AND r.Te=p.Te
     WHERE ((r.Ts = Us OR r.Ts = Vs) AND (r.Te = Ue OR r.Te = Ve)) OR Us IS NULL OR Vs IS NULL;

*******************************************************************************
* TEMPORAL AGGREGATION AVG(DUR(R.T)) FROM R 
*******************************************************************************

WITH R AS (SELECT Ts Us, Te Ue, * FROM R)
SELECT AVG(DUR(Us,Ue)), Ts, Te
FROM (R NORMALIZE R R2 USING() WITH (ts,te,ts,te)) R
GROUP BY Ts, Te;

*******************************************************************************
* R -^T R2
*******************************************************************************
SELECT *
FROM (R NORMALIZE R2 USING(n) WITH (ts,te,ts,te)) R
EXCEPT
SELECT *
FROM (R2 NORMALIZE R USING(n) WITH (ts,te,ts,te)) R2;

*******************************************************************************
* All temporal relations are assumed to be of the form 
* (A_1, A_2, ..., A_n, Ts, Te)
* 
* UDF DUR(DATE, DATE) computes the duration in months (see definition in 
* data.sql)
*******************************************************************************