2016-08-17 7 views
2

У меня есть несколько таблиц, которые содержат название компании/атрибута и рейтинг.SQL - групповые значения от Percentile/Merge Rankings

enter image description here

Я хотел бы написать кусок кода, который позволяет диапазон оценок, которые будут помещены в специальные группы, основанные на процентили балла в отношении к таблицам оценка общей. Я предоставил очень простой пример для демонстрации того, что я ищу, разбив группу из 10 компаний на 5 групп, но я хотел бы масштабировать это, чтобы применить 5 групп к наборам данных со многими строками БЕЗ необходимости указывать значения в заявлении CASE.

enter image description here

ответ

2

NTILE(5) OVER(ORDER BY score) может фактически помещать строки с одинаковым значением в разные квантили (это, вероятно, не то, что вы хотите, по крайней мере, мне это никогда не нравилось).

Это очень похоже на

5 * (row_number() over (order by score) - 1)/count(*) over() 

но если число строк не может быть равномерно распределено остаточные строки добавляются к первым квантилям при использовании NTILE и случайным образом для ROW_NUMBER.

Чтобы назначить все строки с одинаковым значением в тот же квантиль вы должны сделать свой собственный расчет:

5 * (rank() over (order by score) - 1)/count(*) over() 
+0

попробовал это, и есть одно отличие от предложения vkp. По предложению vkp группы составляют 1 -5, по вашему предложению группы 0 -4 ... Есть ли способ воспроизвести ваш метод с группами 1 - 5 вместо 0 - 4? – hansolo

+0

Добавление '+ 1' к результату? – dnoeth

+0

'5 * (rank() over (заказ [Счет Счет]) + 1)/count (*) over(), поскольку grp2' дает мне 0 - 5, только два элемента из 7000 - это 5 ... возможно я просто недопонимаю решение – hansolo

4

Вы можете использовать NTILE разделить данные на 5 ведер на основе баллов. Однако, если данные нельзя разделить на равное количество ящиков или если есть связи, у одной из групп будет больше членов.

SELECT t.*, NTILE(5) OVER(ORDER BY score) as grp 
FROM tablename t 

Read more about NTILE here

+1

Или, если есть связи, то 'NTILE()' бункера не будут тот же размер. –

+0

включил его в ответ @GordonLinoff –

+1

'NTILE' может фактически помещать строки с одинаковым значением в разные квантили. Если вы не хотите, чтобы вы могли использовать этот расчет: '5 * (rank() over (order by score) - 1)/count (*) over()' – dnoeth

2

Вы можете попробовать использовать ROW_NUMBER() и CEILING():

SELECT t.name,t.score, 
     CEILING(ROW_NUMBER() OVER(ORDER BY t.score)/2) as group 
FROM YourTable t 

Это разделит каждую группу из двух в одну группу, с помощью ROW_NUMBER() результата.

+1

Biut тогда вам нужно знать о количестве строк в результате, чтобы создать n квантилей. – dnoeth

Смежные вопросы