Использование SPLIT_PART в PostgreSQL - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть столбец данных, который извлекает тег UTM из объявлений Google с указанными ниже идентификаторами.Он содержит идентификаторы кампании (начальная часть до "___"), а затем идентификатор группы объявлений после.В некоторых случаях у нас есть только идентификаторы кампаний, которые являются строками, поэтому я и выполняю приведение типов с помощью :: TEXT.

Так выглядят теги UTM при извлечении.

835783587___42385125483
eu
968720083___47551372269
en_usa_search_brand
648594695___38174608372
886097479___45386492795
en_trust_control
competitors
es
en_esp_search_route
1072851000___55370810634

Я пытаюсь отделить идентификаторы друг от друга и удалить подчеркивания, а затем перенести их в другой стол.

umc.campaign - это столбец, содержащий тег UTM.

Я создаю эту временную таблицу, чтобы затем перейти к последней таблице ниже.

 CREATE TABLE reports.tmp_sem_attribution  AS (
        SELECT DISTINCT ON (umc.user_id)
            umc.user_id,
            umc.source,
            umc.campaign ::TEXT,
    (SPLIT_PART(REPLACE(campaign,'__','_'),'__',1)) :: TEXT AS campaign_id,
    (SPLIT_PART(REPLACE(campaign,'__','_'),'__',2)) :: TEXT AS adgroup_id,

КогдаЯ использую приведенный ниже запрос, чтобы проверить результаты, и я вижу, что некоторые идентификаторы группы объявлений пусты или содержат пробелы.

reports.sem_attribution_v2 - это таблица, в которой я выдвигаю идентификаторы на две части.разные столбцы.

SELECT * FROM reports.sem_attribution_v2 WHERE adgroup_id =''

**RESULT**
Campaign_ID                     AdGroup ID
eu  
1560591282  
en_usa_search_brand 
1560608121  
en_trust_control    
1560591282  
en_fra_search_generic_manual    
990427417   
eu  

Если вы, ребята, могли бы пролить свет на то, как я могу подойти к этому по-другому, или если этот запрос неверен.Это будет высоко ценится.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать REGEXP_REPLACE

SELECT   REGEXP_REPLACE(campaign,'(\d+)___\d+','\1') as campaign_id,
         REGEXP_REPLACE(campaign,'\d+___(\d+)','\1') as adgroup_id
                 FROM t;

ИЛИ SUSBTRING с условием дела.

SELECT CASE 
         WHEN campaign ~ '(\d+)___(\d+)' THEN 
         substring(campaign FROM '(\d+)___')  --extracts string before "__"
         ELSE campaign                        --same string when pattern not found
       end AS campaign_id, 
       CASE 
         WHEN campaign ~ '(\d+)___(\d+)' THEN 
         substring(campaign FROM '___(\d+)')   --extracts string after "__"
         ELSE campaign 
       end AS adgroup_id 
FROM   t; 

Демо

0 голосов
/ 17 декабря 2018

SPLIT_PART функция вернет пустую строку, когда после разделения будет меньше полей, чем запрошено.Например: если есть только одно поле и вы хотите получить второе поле, вы получите пустую строку.Это правильно и подходит для вашего подхода.

Вы можете упростить ваш запрос, потому что часть REPLACE не обязательна:

(SPLIT_PART(campaign, '___', 1))::TEXT AS campaign_id,
(SPLIT_PART(campaign, '___', 2))::TEXT AS adgroup_id

Другим улучшением может быть замена пустых строк на NULL ценности.Вы можете сделать это, вставляя данные в таблицу reports.sem_attribution_v2:

CASE WHEN adgroup_id = '' THEN NULL ELSE adgroup_id END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...