使用2列进行表分区

Raf*_*cci 17 partitioning sql-server-2008

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

考虑一个包含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
Run Code Online (Sandbox Code Playgroud)

Joe*_*lli 41

坏消息:必须在单个列上定义分区功能.

好消息:单列可能是一个持久计算列,它是您尝试分区的两列的组合.

  • @Nathan:最初的问题是关于[table partitioning](http://msdn.microsoft.com/en-us/library/ms190787.aspx),而不是关于窗口函数. (9认同)
  • 我不确定你的"坏消息"是否正确.我在多列上指定分区没有问题,例如`SELECT ROW_NUMBER()OVER(PARITION 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清楚地表明您可以为分区指定多个值表达式.我错过了什么吗? (5认同)
  • 啊!看看另一个赞成的答案,我想我不是唯一一个犯这个错误的人! (2认同)

小智 13

我发现这是一个更容易的解决方案

select ROW_NUMBER() over (partition by CHECKSUM(value,ID) order by SortOrder) as Row From your_table
Run Code Online (Sandbox Code Playgroud)

  • 校验和可以从不同的输入值产生相同的输出值(基本上是哈希冲突).因此,这种方法不是100%可靠.因此,如果您的分区绝对必须正确,请不要使用此方法.如果你能容忍一个罕见的错误分区,那么这很好. (8认同)
  • 我认为这个问题与表分区有关,而不是与 Windows 函数有关。 (5认同)
  • 与原始问题无关-请务必阅读。 (2认同)