2017-04-24 1 views
1

J'essaie de fusionner des lignes avec des intervalles de date qui se chevauchent dans une table dans Impala SQL. Cependant, les solutions que j'ai trouvées pour résoudre ce problème ne sont pas supportées par Impala par exemple. O WH EXISTE et CTE récursif.Impala SQL: Fusion de lignes avec des dates qui se chevauchent. WHERE EXISTS et CTE récursif non pris en charge

Comment pourrais-je écrire une requête pour cela dans Impala?

Table: @T 
    ID StartDate EndDate 
    1 20170101 20170201 
    2 20170101 20170401 
    3 20170505 20170531  
    4 20170530 20170531 
    5 20170530 20170831 
    6 20171001 20171005 
    7 20171101 20171225 
    8 20171105 20171110 

    Required Output: 
    StartDate EndDate 
    20170101 20170401 
    20170505 20170831 
    20171001 20171005 

Exemple de ce que je suis en train d'y arriver est pas prise en charge Impala:

SELECT 
      s1.StartDate, 
      MIN(t1.EndDate) AS EndDate 
    FROM @T s1 
    INNER JOIN @T t1 ON s1.StartDate <= t1.EndDate 
     AND NOT EXISTS(SELECT * FROM @T t2 
      WHERE t1.EndDate >= t2.StartDate AND t1.EndDate < t2.EndDate) 
    WHERE NOT EXISTS(SELECT * FROM @T s2 
        WHERE s1.StartDate > s2.StartDate AND s1.StartDate <= s2.EndDate) 
    GROUP BY s1.StartDate 
    ORDER BY s1.StartDate 

des questions similaires:

Merge overlapping date intervals

Eliminate and reduce overlapping date ranges

https://gerireshef.wordpress.com/2010/05/02/packing-date-intervals/

https://www.sqlservercentral.com/Forums/Topic826031-8-1.aspx

+1

Par tous les moyens, utiliser le format ISO pour les dates: AAAA-MM-JJ –

Répondre

0
select min(StartDate) as StartDate 
     ,max(EndDate) as EndDate 

from (select StartDate,EndDate 
       ,count (is_gap) over 
       (
        order by StartDate,ID 
       ) as range_id 

     from (select ID,StartDate,EndDate 
         ,case 
          when max (EndDate) over 
            (
             order by StartDate,ID 
             rows  between unbounded preceding 
                and  1 preceding 
            ) < StartDate 
          then true 
         end as is_gap 

       from t 
       ) t 
     ) t 

group by range_id 

order by StartDate 
; 

+------------+------------+ 
| startdate | enddate | 
+------------+------------+ 
| 2017-01-01 | 2017-04-01 | 
| 2017-05-05 | 2017-08-31 | 
| 2017-10-01 | 2017-10-05 | 
| 2017-11-01 | 2017-12-25 | 
+------------+------------+ 
+0

Cela a fonctionné exactement comme je le voulais. Merci beaucoup! Tu es le meilleur. Lifesaver. – user7914003