Извлечение домена из URL с использованием PostgreSQL - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно извлечь доменное имя для списка URL, используя PostgreSQL. В первой версии я пытался использовать REGEXP_REPLACE для замены нежелательных символов, таких как www., Biz., Sports. И т. Д., Чтобы получить доменное имя.

 SELECT REGEXP_REPLACE(url, ^((www|www2|www3|static1|biz|health|travel|property|edu|world|newmedia|digital|ent|staging|cpelection|dev|m-staging|m|maa|cdnnews|testing|cdnpuc|shipping|sports|life|static01|cdn|dev1|ad|backends|avm|displayvideo|tand|static03|subscriptionv3|mdev|beta)\.)?', '') AS "Domain", 
 COUNT(DISTINCT(user)) AS "Unique Users"
 FROM db
 GROUP BY 1
 ORDER BY 2 DESC;

Это кажется неблагоприятным, так как запрос должен постоянно обновляться для списка нежелательных слов.

Я попытался https://stackoverflow.com/a/21174423/10174021 извлечь из конца строки, используя PostgreSQL REGEXP_SUBSTR, но я получаю пустые строки взамен. Есть ли более лучший способ сделать это?

Образец набора данных, который можно попробовать:

 CREATE TABLE sample (
 url VARCHAR(100) NOT NULL);

 INSERT INTO sample url) 
 VALUES 
 ("sample.co.uk"),
 ("www.sample.co.uk"),
 ("www3.sample.co.uk"),
 ("biz.sample.co.uk"),
 ("digital.testing.sam.co"),
 ("sam.co"),
 ("m.sam.co");

Желаемый вывод

+------------------------+--------------+
|    url                 |  domain      |
+------------------------+--------------+
| sample.co.uk           | sample.co.uk |
| www.sample.co.uk       | sample.co.uk |
| www3.sample.co.uk      | sample.co.uk |
| biz.sample.co.uk       | sample.co.uk |
| digital.testing.sam.co | sam.co       |
| sam.co                 | sam.co       |
| m.sam.co               | sam.co       |
+------------------------+--------------+

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Вы можете попробовать это:

with tlds as (
     select * from (values('.co.uk'),('.co'),('.uk')) a(tld)
) ,
sample as (
    select * from (values ('sample.co.uk'),
                          ('www.sample.co.uk'),
                          ('www3.sample.co.uk'),
                          ('biz.sample.co.uk'),
                          ('digital.testing.sam.co'),
                          ('sam.co'),
                          ('m.sam.co')
                   ) a(url)
     ) 
  select url,regexp_replace(url,'(.*\.)(.*'||replace(tld,'.','\.')||')','\2') "domain" from (
            select distinct url,first_value(tld) over (PARTITION BY url order by length(tld) DESC) tld 
               from sample join tlds on (url like '%'||tld) 
         ) a
0 голосов
/ 14 мая 2019

Итак, я нашел решение, используя ответ Джереми и Реми Барона.

  1. Извлеките весь общедоступный суффикс из общедоступного суффикса и сохраните в таблицу, которую я пометил как tlds.

  2. Получитьуникальные URL-адреса в наборе данных и соответствуют его TLD.part1

  3. Извлеките доменное имя, используя regexp_replace (используется в этом запросе) или альтернативу regexp_substr(t1.url, '([a-z]+)(.)'||t1."tld").Окончательный результат: final_output

SQL-запрос выглядит следующим образом:

WITH stored_tld AS(
SELECT 
DISTINCT(s.url),
FIRST_VALUE(t.domain) over (PARTITION BY s.url ORDER BY length(t.domain) DESC
                            rows between unbounded preceding and unbounded following) AS "tld" 
FROM sample s 
JOIN tlds t 
ON (s.url like '%%'||domain))

SELECT 
t1.url,
CASE WHEN t1."tld" IS NULL THEN t1.url ELSE regexp_replace(t1.url,'(.*\.)((.[a-z]*).*'||replace(t1."tld",'.','\.')||')','\2') 
END AS "extracted_domain" 
FROM(
    SELECT a.url,st."tld"
    FROM sample a
    LEFT JOIN stored_tld st
    ON a.url = st.url
    )t1

Ссылки на попытку: SQL Tester

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...