Функция Sql NTILE () с Postalcode

#sql

#sql

Вопрос:

Я пытаюсь разделить некоторые записи на равное количество колод. Она отлично работает с функцией sql Ntile (20). Однако проблема в том, что он также разделяет почтовый код. Разделение должно происходить внутри почтового индекса.

 Select (NTILE(20) OVER(ORDER BY PostalCode ASC)) AS 'DeckNumber' 
from xxx 
order by Postalcode
  

Есть идеи, как это решить?

введите описание изображения здесь

Комментарии:

1. Это для SQL Server ?? SQL != SQL Server! SQL — это просто язык структурированных запросов, который используют многие системы БД …..

2. Если у вас нет ровно 20 почтовых индексов, значение всегда будет охватывать разные почтовые индексы, нет? См. Раздел MSDN «Функции ранжирования»

3. У меня есть тысячи почтовых индексов с дублированием.

4. @pointlesspolitics: другими словами, каков ваш желаемый результат. Пожалуйста, покажите 3 почтовых индекса в качестве примера

5. @pointlesspolitics: пожалуйста, прочитайте то, что мы просим. Я догадался, что вы не можете использовать NTILE. Предоставьте правильные, примерные данные

Ответ №1:

Если вы используете SQL Server — вы должны быть в состоянии сделать это:

 SELECT 
   NTILE(20) OVER(PARTITION BY PostalCode ORDER BY PostalCode ASC) AS 'DeckNumber' 
FROM dbo.xxx 
ORDER BY Postalcode
  

Это «разделит» ваши данные на группы Postalcode , и внутри каждой группы NTILE(20) будет применена функция.

Возможно, вы хотите использовать другое ORDER BY предложение внутри NTILE...OVER() функции — поскольку вы уже разделяете по Postalcode , также упорядочивание по нему на самом деле не имеет большого смысла…

Комментарии:

1. @gbn: не уверен — он говорит «разделить на равное количество колод» — это больше похоже NTILE на (разделить весь диапазон на 20 блоков островов данных)

2. тот же сценарий, что и у меня 1, и я удалил свой

3. @Marc_s, я попробовал, и он ведет себя так же, как Row_Number() . Она заполняет колоды номерами строк, сгруппированными по postalcode

4. @pointlesspolitics: в этом случае вы, вероятно, действительно не ищете NTILE — попробуйте использовать DENSE_RANK() OVER...... , как предложил @gbn. Это дает вам то, что вы ищете??

5. @pointlesspolitics: NTILE просто разбивает ваши данные на столько групп строк примерно одинакового размера — он используется для ответа на такие вещи, как: «покажите мне лучшие 5% всех продаж» и так далее. Возможно, для ваших нужд это не та функция, которую нужно использовать