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)
从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的值来切换出你想要的任何大小.它也应该更好地扩展,因为它只需要通过源表一次.