2011-01-12 3 views
15

Можно ли разбить таблицу на 2 столбца вместо 1 для функции разбиения?Разбиение таблиц с использованием 2 столбцов

Рассмотрим таблицу с 3 колонками

 
    ID (int, primary key, 
    Date (datetime), 
    Num (int) 

Я хочу разделить эту таблицу на 2 колонки: Date и Num.

Это то, что я делаю, чтобы разбить таблицу, используя 1 столбец (дата):

create PARTITION FUNCTION PFN_MonthRange (datetime) 
AS 
RANGE left FOR VALUES ('2009-11-30 23:59:59:997', 
         '2009-12-31 23:59:59:997', 
         '2010-01-31 23:59:59:997', 
         '2010-28-02 23:59:59:997', 
         '2010-03-31 23:59:59:997') 
go 

ответ

34

Bad News: функция Раздел должен быть определен на одной колонке.

Хорошие новости: Этот единственный столбец может быть persisted computed column, который представляет собой комбинацию из двух столбцов, которые вы пытаетесь разбить.

+5

Я не уверен, что ваши «Плохие новости» правильно. У меня нет проблем с указанием раздела на несколько столбцов, например. 'SELECT ROW_NUMBER() OVER (PARTITION BY a.c1, b.c2, a.c3 ORDER BY a.c1, b.c2, a.c3, a.c4) FROM ...' и http: // msdn .microsoft.com/en-us/library/ms189461% 28v = sql.105% 29.aspx ясно показывает, что вы можете указать несколько выражений значений для раздела. Я что-то упускаю? – Nathan

+4

@Nathan: Первоначальный вопрос был о [разбиении таблиц] (http://msdn.microsoft.com/en-us/library/ms190787.aspx), а не о функциях окна. –

+2

ах! Глядя на другой ответ, я полагаю, что я не единственный, кто допустил эту ошибку! – Nathan

2

Естественно, вы не можете разделить на два столбца на SQL Server.

Есть несколько вещей, которые вы могли бы сделать, иметь таблицу поиска, которую вы используете для извлечения того, какое арбитарное целое (раздел) имеет значение, но у вас всего 1000 разделов максимум, поэтому они начнут занимать одинаковые пространство. Вычисляемый подход столбцов страдает этой же проблемой, у вас есть лимит раздела 1k, скорее всего, вы его взорвите.

Я бы, вероятно, просто придерживался раздела даты и располагался прямо на 1-ом месяце, а не налево в последнюю часть месяца.

Что вы намерены получить от второго значения раздела?

18

Я нашел, что это было простым решением

select ROW_NUMBER() over (partition by CHECKSUM(value,ID) order by SortOrder) as Row From your_table 
+0

Это прекрасно работает! Благодаря! –

+8

Контрольная сумма может выдавать одинаковое выходное значение из разных входных значений (в основном, хэш-столкновение). Поэтому этот метод не является на 100% надежным. Поэтому, если ваше разделение абсолютно должно быть правильным, не используйте этот метод. Если вы можете терпеть редкий неправильный раздел, то это нормально. – Nathan

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