Попытка создать 6 сегментированных «групп» данных из одной таблицы (SQL) - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь взять исходные данные, которые содержат 29 268 записей, и создать из них шесть различных уникальных (по адресу электронной почты, который является полем в данных) наборов данных.Вот мой базовый запрос, который захватывает 4878 записей (и этот концептуально, по идее, будет выполняться 6 раз, но мне нужно, чтобы он мог получать новый уникальный набор из 4878 записей каждый раз по адресу электронной почты (гдеАдрес электронной почты в последовательных прогонах запросов не существовал бы в предыдущих прогонах)).Вдобавок ко всему, я думаю сделать что-то с рейтингом, но я не уверен, как мне поступить так, как мне нужно.Я бы классифицировал себя как промежуточный в SQL.Это немного над моей головой.Есть идеи?

select top 1124 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] like '%YAHOO.COM%'

union all

select top 402 * from
Master_Subscribers_Score_GTE_5
where ([E-mail Address] like '%HOTMAIL.COM%' or [E-mail Address] like '%LIVE.COM%')

union all

select top 45 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] like '%AOL.COM%'

union all

select top 2353 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] like '%GMAIL.COM%'

union all

select top 164 * from
Master_Subscribers_Score_GTE_5
where ([E-mail Address] like '%ATT.COM%' or [E-mail Address] like '%SBCGLOBAL.NET%')

union all

select top 8 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] like '%COX.NET%'

union all

select top 3 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] like '%VERIZON.NET%'

union all

select top 70 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] like '%RR.COM%'

union all

select top 712 * from
Master_Subscribers_Score_GTE_5
where [E-mail Address] not like '%YAHOO.COM%' and
[E-mail Address] not like '%HOTMAIL.COM%' and
[E-mail Address] not like '%LIVE.COM%' and
[E-mail Address] not like '%AOL.COM%' and
[E-mail Address] not like '%GMAIL.COM%' and
[E-mail Address] not like '%ATT.COM%' and
[E-mail Address] not like '%SBCGLOBAL.NET%' and
[E-mail Address] not like '%COX.NET%' and
[E-mail Address] not like '%VERIZON.NET%' and
[E-mail Address] not like '%RR.COM%'

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018
with ranked as (
    select m.*, n = row_number() over (partition by b.bucket order by m.[E-mail Address])
    from Master_Subscribers_Score_GTE_5 m
    outer apply (select bucket from (values
        ('yahoo.com'), ('hotmail.com,live.com'),
        ('aol.com'), ('gmail.com'), ('att.com,sbcglobal.net'),
        ('cox.net'), ('verizon.net'), ('rr.com'))
        _(bucket) where exists (
            select * from string_split(bucket, ',')
            where m.[E-mail Address] like '%' + value + '%')) b)

select * from ranked where n % 6 = 0

.. должен дать вам 1124 для yahoo.com, 402 для hotmail.com и live.com и т. Д., Затем запросить где n % 6 = 1 для следующего набора n % 6 = 2 и т. Д.

0 голосов
/ 28 сентября 2018

Во-первых, использование LIKE имеет свои недостатки.Взгляните на этот пост .

. Вы можете получить адрес электронной почты провайдера (хост), используя SUBSTRING и CHARINDEX

.Поставщик

SUBSTRING(Email, CHARINDEX('@', Email, 1)+1, LEN(EmailR) - CHARINDEX('@', Email, 1))

Теперь, поскольку вы получаете часть, с которой нужно фильтровать, используйте ее для фильтрации записей, а затем используйте ROW_NUMBER(), чтобы получить количество записей для каждого поставщика, которое будетиспользуется снова для дальнейшей фильтрации.Вы можете использовать CASE, чтобы завершить записи.

Вот пример:

SELECT *
FROM (
    SELECT *
    ,   CASE
            WHEN  UPPER(EmailDomain) = 'YAHOO.COM' AND RN <= 1124 
            THEN 'Group 1'
            WHEN  UPPER(EmailDomain) = 'HOTMAIL.COM' AND RN <= 402
            THEN 'Group 2'
            WHEN  UPPER(EmailDomain) = 'AOL.COM' AND RN <= 45
            THEN 'Group 3'
            WHEN  UPPER(EmailDomain) = 'GMAIL.COM' AND RN <= 2353
            THEN 'Group 4'
            WHEN  (UPPER(EmailDomain) = 'ATT.COM' OR UPPER(EmailDomain) = 'SBCGLOBAL.NET') AND RN < 164
            THEN 'Group 5'
            WHEN  UPPER(EmailDomain) = 'COX.NET'  AND RN <= 8
            THEN 'Group 6'
            WHEN  UPPER(EmailDomain) = 'VERIZON.NET' AND RN <= 3
            THEN 'Group 7'
            WHEN  UPPER(EmailDomain) = 'RR.COM' AND RN <= 70
            THEN 'Group 8'
            WHEN  UPPER(EmailDomain) NOT IN('YAHOO.COM','HOTMAIL.COM','AOL.COM','GMAIL.COM','ATT.COM','SBCGLOBAL.NET','COX.NET','VERIZON.NET','RR.COM') AND RN <= 712
            THEN 'Group 9'
            ELSE NULL
        END EmailGroup
    FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY EmailDomain ORDER BY EmailDomain) RN 
FROM (
SELECT 
    Email  
,   SUBSTRING(Email, CHARINDEX('@', Email, 1)+1, LEN(EmailR) - CHARINDEX('@', Email, 1)) EmailDomain 
FROM 
    Master_Subscribers_Score_GTE_5
) D 
) C
) E
WHERE 
    EmailGroup IS NOT NULL 

Обратите внимание, что я использовал ROW_NUMBER () вместо SELECT TOP x.Затем я просто присвоил записям, которые ни при каких условиях не подходят, значение NULL, что дало мне простой способ показать только то, что мне нужно, и заполнить остальное значением NULL, чтобы исключить его из результатов.

Я использовал UPPER(), потому что я не знаю параметры сортировки вашей базы данных - чувствительна ли она к регистру или нет.Поэтому я использовал это, чтобы преодолеть это.Если ваша база данных нечувствительна к регистру, она не понадобится.

Надеюсь, это поможет.

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