2011-05-07 19 views
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-PP-T出現P字母)。

我在正確的軌道上嗎?有沒有更高效的方法?我如何防止重疊?

回答

2

如果您只是需要分割的首字母列表到相當平等的羣體,那麼你或許應該這樣做大概你已經做了到現在爲止的方式,但順序稍有不同:

  1. 獲取表格中的所有首字母。

  2. NTILE結果列表。

  3. 將NTILEd結果集合在一起。

WITH letters AS (
    SELECT 
    Letter = LEFT(Name, 1) 
    FROM #Projects 
    GROUP BY LEFT(Name, 1) 
), 
ntiled AS (
    SELECT 
    Letter, 
    Folder = NTILE(7) OVER (ORDER BY Letter) 
    FROM letters 
) 
SELECT 
    Folder, 
    FolderCaption = MIN(Letter) + '-' + MAX(Letter) 
FROM ntiled 
GROUP BY Folder 
+0

好了,信集團*應*根據原始數據進行加權,不是基於字母。 – 2011-05-08 07:12:34

+0

在我看來,如果您撤銷對我答案的接受*並且*將最後一項規範添加到您的問題中,這將是公平的。我會盡力爲你找到合適的解決方案,或者也許別人會比我更快地做到這一點。作爲一種選擇,當然,您可以提出一個新問題,如果這適合您。 – 2011-05-08 10:03:46

相關問題