2011-01-12 73 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