#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% всех продаж» и так далее. Возможно, для ваших нужд это не та функция, которую нужно использовать