Необходимо извлечь данные на основе суммы общего дохода - PullRequest
0 голосов
/ 31 марта 2019

У меня есть набор данных, где у нас 100 000 клиентов. Сумма выручки клиентов составляет 2 миллиона.

Теперь мне нужно 4 партии от 100 000 клиентов, т. Е. 25000, каждая из которых дает доход 0,5 млн.

Пожалуйста, вы можете помочь мне сценарий SQL для этого

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Ваш лучший выбор, вероятно, состоит в том, чтобы просто разделить клиентов на четыре рандомизированные группы. С числами, о которых вы говорите, значения будут довольно близки:

select t.*,
       ntile(4) over (order by newid()) as grp
from t;

Более канонический ответ - сделать стратифицированную выборку. В общем, это очень хорошо сработает:

select t.*,
       (row_number() over (order by revenue) % 4) as grp
from t;

Это не идеально. Тем не менее, нет идеального ответа на ваш вопрос. В конце концов, один клиент может получать половину дохода, что делает невозможным ответить на ваш вопрос с помощью бункеров одинакового размера и с одинаковым доходом.

Метод стратификации действительно может быть уточнен для непрерывных значений. Идея состоит в том, чтобы разбить клиентов на n / 4 корзины на основе выручки, а затем выбрать случайным образом в каждой группе:

select t.*,
       (row_number() over (partition by bin order by newid()) % 4 as grp
from (select t.*,
             (row_number() over (order by revenue) / 4) as bins
      from t
     ) t;
0 голосов
/ 31 марта 2019

Для извлечения пакетов вы можете использовать CTE с ROW_NUMBER ():

with cte as 
( select field1, field2, row_number() over(order by customerid) as rownum
from table)
select * from cte where rownum < 25000

Обратите внимание, что это не гарантирует, что сумма выручки составит 0,5

. Вы можете проверитьдоход, добавив

 with cte as 
    ( select field1, field2, row_number() over(order by customerid) as rownum
    from table)
select sum(revenue) from cte
where rownum < 25000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...