1
名到文件夾列表:分區給出就像一組數據的首字母
id Name
1 Aaa
2 Aab
3 AAc
…
999 Zzz
,我想創建一個按首字母對它進行分區的虛擬文件夾。比如,我想通過7
的功能,並得到7個文件夾,如:
- AC
- DF
- GH
- IM
- NQ
- RS
- TZ
......哪個eac h包含相應的值(例如, 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
...這似乎有點低效。
但它也是錯誤的:有重疊(例如,在J-P
和P-T
出現P
字母)。
我在正確的軌道上嗎?有沒有更高效的方法?我如何防止重疊?
好了,信集團*應*根據原始數據進行加權,不是基於字母。 – 2011-05-08 07:12:34
在我看來,如果您撤銷對我答案的接受*並且*將最後一項規範添加到您的問題中,這將是公平的。我會盡力爲你找到合適的解決方案,或者也許別人會比我更快地做到這一點。作爲一種選擇,當然,您可以提出一個新問題,如果這適合您。 – 2011-05-08 10:03:46