Назначьте значение столбца на основе процентного соотношения строк - PullRequest
0 голосов
/ 21 мая 2019

В DB2 есть способ назначить значение столбца на основе первого x%, затем y% и оставшихся z% строк?

Я пытался использовать функцию row_number (), но не повезло!

Пример ниже Предполагается, что приведенный ниже пример счетчика (id) уже упорядочен в порядке убывания.последние 30% строк будут иметь код L, а остальные будут иметь код M. Если значение 30% строк равно десятичному, то округляется до десятичного знака до 0.

ID     code
5       H
3       H
1       M
4       L
2       L

Ответы [ 2 ]

1 голос
/ 21 мая 2019

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

select t.id,
       (case ntile(3) over (order by count(id) desc) 
            when 1 then 'H'
            when 2 then 'M'
            when 3 then 'L'
        end) as grp
from t
group by t.id;

Это объединяет их в группы равного размера.

Чтобы разделить ваши условия на 30-40-30%, вы должны быть более осторожными:

select t.id,
       (case when (seqnum - 1.0) < 0.3 * cnt then 'H'
             when (seqnum + 1.0) > 0.7 * cnt then 'L'
             else 'M'
        end) as grp
from (select t.id,
             count(*) as cnt,
             count(*) over () as num_ids,
             row_number() over (order by count(*) desc) as seqnum
      from t
      group by t.id
     ) t
0 голосов
/ 23 мая 2019

Попробуйте это:

with t(ID, count_id) as (values
  (5, 10)
, (3, 8)
, (1, 5)
, (4, 3)
, (2, 1)
)
select t.*
, case 
    when pst <=30 then 'H'
    when pst <=70 then 'M'
    else 'L'
  end as code
from 
(
  select t.*
  , rownumber() over (order by count_id desc) as rn
  , 100*rownumber() over (order by count_id desc)/nullif(count(1) over(), 0) as pst
  from t
) t;

Результат:

ID COUNT_ID RN PST CODE
-- -------- -- --- ----
 5       10  1  20 H
 3        8  2  40 M
 1        5  3  60 M
 4        3  4  80 L
 2        1  5 100 L
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...