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

WITH R AS (SELECT Ts Us, Te Ue, * FROM R)
SELECT ABSORB n , a, min, max, r.Ts, r.Te
FROM (R ALIGN P ON DUR(Us,Ue) BETWEEN Min AND Max) r
     LEFT OUTER JOIN
     (P ALIGN R ON DUR(Us,Ue) BETWEEN Min AND Max) p
     ON DUR(Us,Ue) BETWEEN Min AND Max AND
        r.Ts=p.Ts AND r.Te=p.Te;

*******************************************************************************
* 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 USING()) R
GROUP BY Ts, Te;

*******************************************************************************
* R -^T R2
*******************************************************************************
SELECT *
FROM (R NORMALIZE R2 USING(n)) R
EXCEPT
SELECT *
FROM (R2 NORMALIZE R USING(n)) 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)
*******************************************************************************