次のような一連のデータが与えられた場合:
id Name
1 Aaa
2 Aab
3 AAc
…
999 Zzz
、頭文字で区切る仮想フォルダを作りたいです。7
たとえば、関数に渡して 7 つのフォルダーを取得したいとします。
- 交流
- DF
- GH
- わたしは
- NQ
- RS
- TZ
…それぞれにそれぞれの値が含まれます (例: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
目的の値を追加するために、さらに 2 つの結合を行っています。
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
)。
私は正しい軌道に乗っていますか?より効率的な方法はありますか?オーバーラップを防ぐにはどうすればよいですか?