【发布时间】:2011-05-07 18:35:17
【问题描述】:
给定一组数据,例如:
id Name
1 Aaa
2 Aab
3 AAc
…
999 Zzz
,我想创建按首字母分区的虚拟文件夹。例如,我想将7 传递给一个函数并获取7个文件夹,例如:
- A-C
- D-F
- G-H
- 我-我
- N-Q
- R-S
- T-Z
...每个都包含各自的值(例如,T-Z 将包含 Zzz)。我发现我可以使用NTILE() 来相当接近预期的结果:
WITH Ntiles(Name, Ntile) AS (
SELECT Name, NTILE(7) OVER(ORDER BY Name) FROM #Projects
)
SELECT MIN(LEFT(N.Name, 1)) + '-' + MAX(LEFT(N.Name, 1))
FROM Ntiles N
GROUP BY Ntile
为了添加所需的值,我正在做另外两个连接:
WITH Ntiles(Name, Ntile) AS (
SELECT Name, NTILE(7) OVER(ORDER BY Name) FROM #Projects
) SELECT P.Name, (
SELECT MIN(LEFT(N1.Name, 1)) + '-' + MAX(LEFT(N1.Name, 1)) FROM Ntiles N1
WHERE N1.Ntile = N2.Ntile
GROUP BY N1.Ntile
) FROM #Projects P INNER JOIN Ntiles N2 ON P.Name = N2.Name
……这似乎有点低效。
但这也是错误的:有重叠(例如,字母P 出现在J-P 和P-T 中)。
我在正确的轨道上吗?有没有更有效的方法?如何防止重叠?
【问题讨论】:
标签: sql tsql ranking-functions