2011-05-07 4 views
1

하여 폴더에 이름 목록 :파티션과 같은 데이터의 집합을 감안할 때 초기 편지

id Name 
    1 Aaa 
    2 Aab 
    3 AAc 
… 
999 Zzz 

을, 나는 첫 글자하여 파티션을 가상 폴더를 만들고 싶습니다. 예를 들어, 내가, 예를 들어, 함수에 7를 통과하고 7 개 폴더를 좀하고 싶습니다 :

  • AC
  • DF
  • GH
  • IM
  • NQ
  • RS를
  • TZ

... 어느 eac h는 각각의 값을 포함한다. T-ZZzz을 포함합니다).

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 

을 ...하는 것 같다 :

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 

내가 다른 두 개의 조인하고있어, 원하는 값을 추가하려면 : 내가 원하는 결과에 사실을 얻을 수 NTILE()를 사용할 수 있음을 알아 냈어요 조금 비효율적이다.

그러나 또한 잘못되었습니다. 중복이 있습니다 (예 : PJ-PP-T에 모두 표시됨).

올바른 경로에 있습니까? 더 효율적인 방법이 있습니까? 중복을 방지하려면 어떻게해야합니까? 당신은 단순히 상당히 동일한 그룹으로 초기 편지 목록을 분할해야하는 경우

답변

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

음, *는 * 원본 데이터를 기반으로 가중치를해야 편지 그룹이, 문자를 기반으로하지. –

+0

내 의견으로는, 당신이 내 대답 *의 수락을 취소하고 당신의 마지막 질문을 귀하의 질문에 추가한다면 공정 할 것입니다. 나는 당신에게 맞는 해결책을 찾으려고 노력할 것입니다. 아니면 다른 누군가가 저보다 빨리 그것을 할 수있을 것입니다. 대안으로, 당신이 새로운 질문을 할 수도 있습니다. –

관련 문제