1

次のような一連のデータが与えられた場合:

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)。

私は正しい軌道に乗っていますか?より効率的な方法はありますか?オーバーラップを防ぐにはどうすればよいですか?

4

1 に答える 1