ABC сортировка T-SQL - PullRequest
       31

ABC сортировка T-SQL

1 голос
/ 10 октября 2019

У меня есть выбранный вывод с этим столбцом, который имеет около 318 строк

skiped_times
-----------
        967
        967
        244
        153
        125
        116
        116
        116
        116
        116
        116
         98
         94
         89
         73
         73
         72
         66
         61
         60
         60
         60
         60
         60
         55
         48

...

Суммарное значение этого столбца составляет около 6 100, и я хочу в другой столбец отсортировать эти значения в 3 группы, гденапример, в группе A будут первые 20% строк подсчитанных значений, в группе B - 30%, а в C - остальные

Надеюсь, вы понимаете мой вопрос

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Использовать оконные функции:

select t.*,
       (case when seqnum < num * 0.2 as 'A'
             when seqnum < num * 0.5 as 'B'
             else 'C'
        end) as grp
from (select t.*,
             rank() over (order by skiped_times desc) as seqnum,
             count(*) over () as num
      from t
     ) t;

Примечание. Использование rank() означает, что значения со связями помещаются в одну группу. Если они могут быть разделены между группами, тогда используйте row_number().

РЕДАКТИРОВАТЬ:

Если вы хотите это с помощью sum значений - ну, сначала вы должны бытьясно в вопросе, а не в комментарии. Вы можете использовать ту же идею:

select t.*,
       (case when running_sum < total * 0.2 as 'A'
             when running_sum < total * 0.5 as 'B'
             else 'C'
        end) as grp
from (select t.*,
             sum(skiped_times) over (order by skiped_times desc) as running_sum,
             sum(skiped_times) over () as total
      from t
     ) t;
0 голосов
/ 10 октября 2019

О, мой друг .. Вы дали мне хорошую подготовку для этого вопроса.

Слышать - это решение. Я надеюсь, что эта работа для вас

Declare @Percent20 int
Declare @Percent30 int

set @Percent20 = (select count(skiped_times) from TABLE_NAME) * 0.20

select @Percent20
set @Percent30 = (select count(skiped_times) from TABLE_NAME) * 0.30
select @Percent30


select 
ID,

(Case 
when exists(select result.skiped_times where result.skiped_times in (select top (@Percent20) skiped_times from TABLE_NAME order by skiped_times ))
then 'A'
when  Exists(select result.skiped_times where result.skiped_times in (select top (@Percent30) skiped_times from TABLE_NAME order by skiped_times ))
then 'B'
when  Exists(select result.skiped_times where result.skiped_times in (select skiped_times from TABLE_NAME order by skiped_times offset (@Percent30) rows ))
then 'C'

end

) as Per
 from (

select 
s.skiped_times from TABLE_NAME  s

 ) as result

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