SQL*_*hao 3 sql sql-server sql-server-2008-r2
Col1
----------
1
2
3
4....all the way to 27
Run Code Online (Sandbox Code Playgroud)
我想添加第二列,为5个组分配一个数字.
Col1 Col2
----- ------
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2...and so on
Run Code Online (Sandbox Code Playgroud)
第6组中应该有2行.
NTILE没有完成我想要的,因为NTILE处理组的方式如果它们不能被整数整除.
如果分区中的行数不能被integer_expression整除,则会导致两个大小的组相差一个成员.较大的组按OVER子句指定的顺序位于较小的组之前.例如,如果总行数为53且组数为5,则前三个组将具有11行,其余两个组将分别具有10行.另一方面,如果总行数可以被组的数量整除,则行将在各组之间均匀分布.例如,如果总行数为50,并且有五个组,则每个存储桶将包含10行.
这个SQL小提琴清楚地证明了这一点.第4组,第5组,第6组每组有4行,其余组有5行.我有一些开始一些解决方案,但它们变得冗长,我觉得我错过了一些东西,这可以在一行中完成.
你可以用这个:
;WITH CTE AS
(
SELECT col1,
RN = ROW_NUMBER() OVER(ORDER BY col1)
FROM TableA
)
SELECT col1, (RN-1)/5+1 col2
FROM CTE;
Run Code Online (Sandbox Code Playgroud)
在您的样本数据中,col1是相关的无间隙,因此您可以直接使用它(如果它是INT)而不使用ROW_NUMBER().但如果不是这样,那么这个答案也有效.这是修改后的sqlfiddle.
有点数学可以走很长的路。从所有值中减去 1 将 5(边缘情况)放入此处的前一组,将 6 放入下一组。按您的组大小划分分区并添加一个会得到您正在寻找的结果。此外,此处的SQLFiddle示例修复了您的迭代插入 - 该表仅增加到 27。
SELECT col1,
floor((col1-1)/5)+1 as grpNum
FROM tableA
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1311 次 |
| 最近记录: |