Changes between Initial Version and Version 1 of recursive query to find spatial duplicates


Ignore:
Timestamp:
Jan 5, 2019 11:16:30 PM (6 years ago)
Author:
cedric
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • recursive query to find spatial duplicates

    v1 v1  
     1= Recursive query to find duplicates = 
     2 
     3 
     4{{{#!sql 
     5 
     6/* 
     7Dans la récurisve ci dessous la premire partie cree un tableau avec (id1 id2 s_bruto) 
     8Ou les id1 sont à moins de xx m de distance de id2 
     9Plusieurs ouvrages peuvent être à distance proche... 
     10 
     11Dans la deuxième partie, récursive, (search_path est la vraie récursive mais il faut mettre récursive en tête) 
     12on fait une jointure entre id2 et id1 qui s'arrête quand il n'y a plus de lien. Cet arrêt est dans la colonne cycle. 
     13Un petit truc que j'ai mis du temps à trouver c'est le ::text, sinon j'avais des incompatible type character varying 10 
     14et charcater varying, et si j'essayais de caster en character varying je perdais array, et si j'assayais character varying[] ça 
     15marchait pas... 
     16 
     17Ci dessous il y a plusieurs niveaux d'agréggation, par exemple chain5_et_ses_petits correspond à  
     18id1;id2;sbruto_m;depth;path 
     19SO_180;SO_181;;5;{SO_188,SO_187,SO_183,SO_181,SO_180} 
     20SO_180;SO_181;;4;{SO_187,SO_183,SO_181,SO_180} 
     21SO_181;SO_183;;4;{SO_188,SO_187,SO_183,SO_181} 
     22SO_180;SO_183;;4;{SO_188,SO_187,SO_183,SO_180} 
     23SO_180;SO_181;;4;{SO_187,SO_183,SO_181,SO_180} 
     24SO_180;SO_181;;4;{SO_188,SO_183,SO_181,SO_180} 
     25SO_180;SO_181;;4;{SO_188,SO_187,SO_181,SO_180} 
     26SO_180;SO_183;;3;{SO_187,SO_183,SO_180} 
     27SO_180;SO_181;;3;{SO_187,SO_181,SO_180} 
     28SO_183;SO_187;;3;{SO_188,SO_187,SO_183} 
     29SO_181;SO_187;;3;{SO_188,SO_187,SO_181} 
     30SO_180;SO_187;;3;{SO_188,SO_187,SO_180} 
     31SO_181;SO_183;;3;{SO_188,SO_183,SO_181} 
     32SO_180;SO_183;;3;{SO_188,SO_183,SO_180} 
     33SO_180;SO_181;;3;{SO_188,SO_181,SO_180} 
     34SO_180;SO_181;;3;{SO_183,SO_181,SO_180} 
     35SO_180;SO_181;;3;{SO_183,SO_181,SO_180} 
     36SO_180;SO_181;;3;{SO_183,SO_181,SO_180} 
     37SO_181;SO_183;;3;{SO_187,SO_183,SO_181} 
     38SO_180;SO_183;;3;{SO_187,SO_183,SO_180} 
     39.... 
     40Donc j'enlève ensuite toutes les lignes contenant un élement de SO_180;SO_181;;5;{SO_188,SO_187,SO_183,SO_181,SO_180} 
     41Puis je continue à l'étape 4 ... 
     42 
     43*/ 
     44 
     45WITH grouped_array as( 
     46WITH RECURSIVE graph as (SELECT sp1.id AS id1, sp2.id AS id2 FROM  
     47        sudoang.spain_obstruction_in_spain AS sp1 JOIN 
     48        sudoang.spain_obstruction_in_spain AS sp2 ON 
     49        ST_dwithin(sp1.geom, sp2.geom,10) 
     50        where sp1.id != sp2.id  
     51        and substring(sp1.id from 4) < substring(sp2.id from 4) 
     52        order by substring(sp1.id from 4)::numeric, 
     53        substring(sp2.id from 4)::numeric), 
     54         
     55 search_graph(id1, id2, depth, path, cycle) AS ( 
     56        SELECT g.id1, g.id2,  1, 
     57          ARRAY[g.id1::text], 
     58          false 
     59        from graph g 
     60      UNION ALL 
     61        SELECT g.id1, g.id2, sg.depth + 1, 
     62          path || ARRAY[g.id1::text], 
     63          sg.id2 in (select g.id1 from graph) 
     64        FROM graph g, search_graph sg 
     65        WHERE g.id2 = sg.id1  
     66        AND NOT cycle 
     67) 
     68SELECT  id1, id2, path, depth -- (cycle) j'ai plus besoin de cycle qui servait dans la partie récursive  
     69FROM search_graph order by depth desc  
     70),--grouped_array, 
     71chain5 as (select * from grouped_array where depth =5), 
     72chain4 as (select * from grouped_array where depth =4), 
     73chain3 as (select * from grouped_array where depth =3), 
     74chain2 as (select * from grouped_array where depth =2), 
     75 
     76chain5_et_ses_petits as ( 
     77select grouped_array.* from chain5 JOIN grouped_array on chain5.path && grouped_array.path), 
     78 
     79chain4_et_ses_petits as ( 
     80select grouped_array.* from chain4 JOIN grouped_array on chain4.path && grouped_array.path 
     81where chain4.path not in (select path from chain5_et_ses_petits)), 
     82 
     83chain3_et_ses_petits as ( 
     84select grouped_array.* from chain3 JOIN grouped_array on chain3.path && grouped_array.path 
     85where chain3.path not in (select path from chain4_et_ses_petits) 
     86and chain3.path not in (select path from chain5_et_ses_petits)), 
     87 
     88chain2_et_ses_petits as ( 
     89select grouped_array.* from chain2 JOIN grouped_array on chain2.path && grouped_array.path 
     90where chain2.path not in (select path from chain3_et_ses_petits) 
     91and chain2.path not in (select path from chain4_et_ses_petits) 
     92and chain2.path not in (select path from chain5_et_ses_petits)), 
     93 
     94chain1 as ( 
     95select * from grouped_array where depth=1 
     96and grouped_array.path not in (select path from chain2_et_ses_petits) 
     97and grouped_array.path not in (select path from chain3_et_ses_petits) 
     98and grouped_array.path not in (select path from chain4_et_ses_petits) 
     99and grouped_array.path not in (select path from chain5_et_ses_petits)), 
     100 
     101bigunion as ( 
     102select * from chain5_et_ses_petits where depth=5 
     103UNION 
     104select * from chain4_et_ses_petits where depth=4 
     105UNION 
     106select * from chain3_et_ses_petits where depth=3 
     107UNION 
     108select * from chain2_et_ses_petits where depth=2 
     109UNION 
     110select * from chain1) 
     111 
     112select * from bigunion order by depth desc, id1 
     113 
     114/* 
     115id1;id2;path;depth 
     116SO_180;SO_181;{SO_188,SO_187,SO_183,SO_181,SO_180};5 
     117SO_2158;SO_2161;{SO_2164,SO_2162,SO_2161,SO_2158};4 
     118SO_14;SO_15;{SO_16,SO_15,SO_14};3 
     119SO_2195;SO_2196;{SO_2197,SO_2196,SO_2195};3 
     120SO_2697;SO_2698;{SO_2700,SO_2698,SO_2697};3 
     121SO_3049;SO_3050;{SO_3051,SO_3050,SO_3049};3 
     122SO_1472;SO_1945;{SO_1945,SO_1472};2 
     123SO_2641;SO_2642;{SO_2642,SO_2641};2 
     124SO_2682;SO_2683;{SO_2683,SO_2682};2 
     125SO_3084;SO_3086;{SO_3086,SO_3084};2 
     126SO_1046;SO_1252;{SO_1046};1 
     127SO_1047;SO_120;{SO_1047};1 
     128SO_1167;SO_3021;{SO_1167};1 
     129SO_118;SO_119;{SO_118};1 
     130SO_1217;SO_1398;{SO_1217};1 
     131SO_1234;SO_1235;{SO_1234};1 
     132SO_1243;SO_3102;{SO_1243};1 
     133SO_1282;SO_1283;{SO_1282};1 
     134SO_1299;SO_1300;{SO_1299};1 
     135SO_1302;SO_1303;{SO_1302};1 
     136SO_1309;SO_2232;{SO_1309};1 
     137SO_1312;SO_3276;{SO_1312};1 
     138SO_1504;SO_3308;{SO_1504};1 
     139SO_1518;SO_1519;{SO_1518};1 
     140SO_1567;SO_1568;{SO_1567};1 
     141SO_1635;SO_1637;{SO_1635};1 
     142SO_1852;SO_3344;{SO_1852};1 
     143SO_1868;SO_1869;{SO_1868};1 
     144SO_1902;SO_1903;{SO_1902};1 
     145SO_198;SO_491;{SO_198};1 
     146SO_2059;SO_2060;{SO_2059};1 
     147SO_2064;SO_3377;{SO_2064};1 
     148SO_2075;SO_2076;{SO_2075};1 
     149SO_2129;SO_2134;{SO_2129};1 
     150SO_2141;SO_3384;{SO_2141};1 
     151SO_2186;SO_2187;{SO_2186};1 
     152SO_2200;SO_2202;{SO_2200};1 
     153SO_229;SO_230;{SO_229};1 
     154SO_2299;SO_3412;{SO_2299};1 
     155SO_2303;SO_3413;{SO_2303};1 
     156SO_2320;SO_2321;{SO_2320};1 
     157SO_2323;SO_2324;{SO_2323};1 
     158SO_2340;SO_2341;{SO_2340};1 
     159SO_2366;SO_2367;{SO_2366};1 
     160SO_2393;SO_2395;{SO_2393};1 
     161SO_2396;SO_2397;{SO_2396};1 
     162SO_2450;SO_2451;{SO_2450};1 
     163SO_2507;SO_2594;{SO_2507};1 
     164SO_2567;SO_2569;{SO_2567};1 
     165SO_2585;SO_2586;{SO_2585};1 
     166SO_2770;SO_2771;{SO_2770};1 
     167SO_2812;SO_2822;{SO_2812};1 
     168SO_2842;SO_2843;{SO_2842};1 
     169SO_2847;SO_2848;{SO_2847};1 
     170SO_288;SO_874;{SO_288};1 
     171SO_2915;SO_2923;{SO_2915};1 
     172SO_2916;SO_2924;{SO_2916};1 
     173SO_292;SO_79;{SO_292};1 
     174SO_2979;SO_2980;{SO_2979};1 
     175SO_2981;SO_2983;{SO_2981};1 
     176SO_3026;SO_3027;{SO_3026};1 
     177SO_3081;SO_962;{SO_3081};1 
     178SO_313;SO_315;{SO_313};1 
     179SO_3150;SO_3153;{SO_3150};1 
     180SO_3170;SO_3171;{SO_3170};1 
     181SO_3185;SO_3614;{SO_3185};1 
     182SO_3329;SO_3330;{SO_3329};1 
     183SO_3386;SO_3387;{SO_3386};1 
     184SO_339;SO_340;{SO_339};1 
     185SO_3460;SO_3461;{SO_3460};1 
     186SO_3532;SO_3533;{SO_3532};1 
     187SO_3619;SO_3620;{SO_3619};1 
     188SO_374;SO_382;{SO_374};1 
     189SO_42;SO_44;{SO_42};1 
     190SO_456;SO_457;{SO_456};1 
     191SO_969;SO_971;{SO_969};1 
     192*/ 
     193}}}