2011-01-12 116 views
15

是否可以使用2列对分区函数进行分区而不是对1进行分区?使用2列进行表分区

考虑有3列

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

我想2列对该表进行分区的表:DateNum

这是我做的分区使用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

坏消息:分区函数必须在单个列定义。

好消息:该单列可能是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 2013-07-18 18:34:52

+4

@Nathan:原来的问题是关于[表分区](http://msdn.microsoft.com/en-us/library/ms190787.aspx),而不是关于窗口函数。 – 2013-07-18 21:22:02

2

本地化,不,你不能在SQL Server中按两列进行分区。

有几件事你可以做,有一个查找表,你用它来提取哪个任意整数(分区)每个值都在,但你最多只有1000个分区,所以他们将开始占用相同的空间。计算列方法会遇到同样的问题,你有1k的分区限制,你可能会吹。

我可能只是坚持一个日期分区,并在本月的第一天范围内,而不是在本月的最后一部分左侧。

你打算从第二个分区值中获得什么?

18

,我发现这是一个简单的解决方案

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