Распространять записи на основе различных процентов с помощью TSQL - PullRequest
0 голосов
/ 27 мая 2018

У меня есть таблица предметов с 800k строк.Мне нужно создать оператор SQL, который позволяет моим пользователям передавать различные проценты, которые будут составлять 100% и ограничиваться 5 процентами.Затем они используются для группировки строк по номеру группы каждого процента.

Например, пользователь может запросить разделение строк, используя следующие случайные проценты (пользователь определяет проценты):

 1. 20%, 20%, 30%, 30% 
 2. 12%, 12%, 12%, 12%, 52%
 3. 30%, 30%, 40%
 4. 100%

Исходя из вышеуказанных процентов, мне нужно вернуть следующее:

Field 1    | Field 2    | Group
--------------------------------
Data       | Data       | 1
Data       | Data       | 1

Группа будет представлять число, соответствующее процентам.Так, например, в процентах №1 выше, было бы 4 группы, в которых записи первой группы составляли первые 20% всех выбранных элементов, группа 2 - следующие 20%, третья группа - следующие 30%, а четвертая группа -последние 30%.Следовательно, если было всего 200 записей, в группе 1 должно быть 40 записей, в группе 2 - 40, в группе 3 - 60, а в группе 4 - 60.

Извините, если я перестаю объяснять это, но пытаюсьчтобы уменьшить двусмысленность в моем вопросе, чтобы было понятно.

Эти данные хранятся в Azure SQL, поэтому любое предоставленное решение может использовать все, что предлагает Azure SQL и / или SQL 2016 (в большинстве случаев).

Заранее спасибо гениям SQL, чтообязательно, чтобы заставить меня чувствовать себя благодарным и неполноценным одновременно!:)

1 Ответ

0 голосов
/ 27 мая 2018

Проход в процентах является сложной частью.Работа выполнена percent_rank():

with p as (
      select ind, p, (sum(p) over (order by ind) - p) as cume_p
      from (values (1, 0.2), (2, 0.2), (3, 0.3), (4, 0.4)) v(ind, p)
     )
select t.*, v.grp
from (select t.*, percent_rank() over (order by ?) as pr
      from t
     ) t cross apply
     (select max(ind)
      from p
      where p.cume_p <= t.pr
     )  v(grp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...