gigafibre-fsm/scripts/migration/normalize_service_locations_pass2.sql
louispaulb 0edf2fe3df SL normalisation passe 2 : récupération GPS par numéro+ville (sans contrainte postale)
scripts/migration/normalize_service_locations_pass2.sql : pour les SL restées review/unmatched après la
passe 1 (code postal+numéro), rematch par NUMÉRO + VILLE (trigram, normalisation St→Saint) + meilleure rue
par similarité ≥0.30 (rue seule, pas ville-incluse pour éviter le gonflement) → upgrade en validated avec
coords RQA réelles. Récupère les SL au code postal erroné/manquant mais ville valide (ex. Athelstan/Ch Ridge).

Résultat : +264 validated (15 195), unmatched 766→550. GPS sur 17 036/17 111 services (99,6%),
dont 15 195 (89%) rooftop AQ. Les 75 sans GPS = boîtes postales/hors-QC/placeholders/sobriquets camping
(pas de position de service réelle). Idempotent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 16:19:37 -04:00

44 lines
1.9 KiB
PL/PgSQL

-- normalize_service_locations_pass2.sql — RÉCUPÉRATION par NUMÉRO + VILLE (sans contrainte de code postal),
-- pour les Service Locations restées 'review'/'unmatched' après la passe 1 (postal+numéro). Beaucoup ont un
-- code postal erroné/manquant mais une ville valide → on retrouve la rue par similarité.
--
-- N'UPGRADE qu'avec une similarité ≥0.30 (barre + stricte qu'en passe 1 car pas de contrainte postale) →
-- met aq_address_id + linked_address + coords RQA réelles + statut 'validated'. Laisse le reste tel quel
-- (boîtes postales C.P./PO Box, adresses hors-QC, surnoms de camping). address_line/city/postal INCHANGÉS.
\timing on
BEGIN;
UPDATE "tabService Location" sl SET
aq_address_id = m.id,
linked_address = m.address_full,
latitude = m.lat,
longitude = m.lon,
address_validation_status = 'validated',
address_validated_at = NOW(),
modified = NOW()
FROM (
SELECT s.name, m.id, m.address_full, m.lat, m.lon, m.sim
FROM "tabService Location" s
CROSS JOIN LATERAL (
SELECT a.id::text AS id, a.address_full, a.latitude AS lat, a.longitude AS lon,
similarity(a.search_text, lower(unaccent(s.address_line))) AS sim
FROM rqa_addresses a
WHERE a.numero = (regexp_match(s.address_line, '^\s*(\d+)'))[1]
AND a.ville % regexp_replace(regexp_replace(lower(unaccent(coalesce(s.city,''))), '^ste[ .-]', 'sainte-'), '^st[ .-]', 'saint-')
ORDER BY similarity(a.search_text, lower(unaccent(s.address_line))) DESC
LIMIT 1
) m
WHERE s.address_validation_status IN ('review', 'unmatched')
AND s.address_line ~ '^[0-9]'
AND s.city NOT IN ('', 'N/A', 'Ville', 'x')
AND m.sim >= 0.30
) m
WHERE m.name = sl.name;
SELECT address_validation_status AS statut, count(*) AS n,
count(NULLIF(aq_address_id,'')) AS avec_lien,
count(*) FILTER (WHERE latitude IS NOT NULL AND latitude<>0) AS avec_gps
FROM "tabService Location" GROUP BY 1 ORDER BY 2 DESC;
COMMIT;