SQL - 在X个表中平均分配相同的值

Ski*_*Pro 1 sql equals sql-server-2012

我想知道是否有人知道在"x"个临时表中均匀分布多个相似值的方法,确保'like'值(本例中相同的团队名称)永远不会集中到一个特定的表中.我要做的是为比赛创造热量,并在桌子之间平均分配球队.例如:

**Teams**
-----------
Los Angeles
New York
New York
Los Angeles
Florida
Florida
Arizona
Texas
Alabama
Alaska
New York
New York
New York
Run Code Online (Sandbox Code Playgroud)

我希望这个发行版最终会像这样,所有多个团队均匀分布在2(或3或4)个热点上:

**Heat One**  
-------------                        
Los Angeles                       
New York                          
Florida                           
Arizona                           
Alabama                           
New York                          
New York

**Heat Two**
------------
Los Angeles
New York
Florida
Texas
Alaska
New York
Run Code Online (Sandbox Code Playgroud)

bil*_*nkc 5

从SQL Server 2005开始,存在用于分段数据的本机功能.NTILE()

NTILE函数是SQL Server 2005中引入的四个窗口函数中的第四个.NTILE采用不同的方法来分区数据.ROW_NUMBER,RANK和DENSE_RANK将根据分区键生成可变大小的数据桶.NTILE尝试将数据拆分为相同的固定大小的存储区.如果您想要快速直观地了解其效果,BOL有一个综合页面来比较排名功能.

句法

NTILE的语法与其他窗口函数略有不同.它是NTILE(@BUCKET_COUNT) OVER ([PARTITION BY _] ORDER BY _),@ BUCKET_COUNT是正整数或bigint值.

挑战在于确保我们获得良好的分布,这是受随机数生成器迷惑的部分(newid调用/(SELECT NULL)).

利用Rhys的设置

CREATE table dbo.Teams (TeamId int, TeamName varchar(32));

insert dbo.Teams values
( 1, 'Los Angeles'),
( 2, 'New York'),
( 3, 'New York'),
( 4, 'Los Angeles'),
( 5, 'Florida'),
( 6, 'Florida'),
( 7, 'Arizona'),
( 8, 'Texas'),
( 9, 'Alabama'),
(10, 'Alaska'),
(11, 'New York'),
(12, 'New York'),
(13, 'New York');

SELECT
    NTILE(2) OVER (ORDER BY NEWID()) AS Heat
,   NTILE(2) OVER (ORDER BY (SELECT NULL)) AS HeatAlternate
,   T.TeamName
,   T.TeamId
FROM
    dbo.Teams AS T
ORDER BY
    1,3;
Run Code Online (Sandbox Code Playgroud)

关于这种方法的一个更好的事情是它可以通过简单地改变传递给ntile的值来切换出你想要的任何大小.它也应该更好地扩展,因为它只需要通过源表一次.