0

"시나리오"값이 증가하면 같은 패턴을 반복하여 반복적 인 CTE를 반복해서 사용하려고합니다. RowNumber는 원하는대로 1-21을 반복하지만, "시나리오"가 짝수 일 때마다 "발"열에 "값"으로 공급할 항목이 너무 적습니다. 나는 코드의 어느 부분이 심지어 시나리오조차도 짧게 하나가되게하는지 알 수 없다.SQL 재귀 CTE 예기치 않게 교대 집합을 반환합니다

아래 코드는 내가 맨 아래에 사용하는 코드입니다.

Scenario RowNumber Value Vals 
1 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 4 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 5 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 6 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 7 A A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 8 A A,A,A,A,A,A,A,A,A,A,A,B,C 
1 9 A A,A,A,A,A,A,A,A,A,A,B,C 
1 10 A A,A,A,A,A,A,A,A,A,B,C 
1 11 A A,A,A,A,A,A,A,A,B,C 
1 12 A A,A,A,A,A,A,A,B,C 
1 13 A A,A,A,A,A,A,B,C 
1 14 A A,A,A,A,A,B,C 
1 15 A A,A,A,A,B,C 
1 16 A A,A,A,B,C 
1 17 A A,A,B,C 
1 18 A A,B,C 
1 19 A B,C 
1 20 B C 
1 21 C 
2 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 4 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 5 A A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 6 A A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 7 A A,A,A,A,A,A,A,A,A,A,B,B,C 
2 8 A A,A,A,A,A,A,A,A,A,B,B,C 
2 9 A A,A,A,A,A,A,A,A,B,B,C 
2 10 A A,A,A,A,A,A,A,B,B,C 
2 11 A A,A,A,A,A,A,B,B,C 
2 12 A A,A,A,A,A,B,B,C 
2 13 A A,A,A,A,B,B,C 
2 14 A A,A,A,B,B,C 
2 15 A A,A,B,B,C 
2 16 A A,B,B,C 
2 17 A B,B,C 
2 18 B B,C 
2 19 B C 
2 20 C 
2 21 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
3 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 4 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 5 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 6 A A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 7 A A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 8 A A,A,A,A,A,A,A,A,A,A,B,C,C 
3 9 A A,A,A,A,A,A,A,A,A,B,C,C 
3 10 A A,A,A,A,A,A,A,A,B,C,C 
3 11 A A,A,A,A,A,A,A,B,C,C 
3 12 A A,A,A,A,A,A,B,C,C 
3 13 A A,A,A,A,A,B,C,C 
3 14 A A,A,A,A,B,C,C 
3 15 A A,A,A,B,C,C 
3 16 A A,A,B,C,C 
3 17 A A,B,C,C 
3 18 A B,C,C 
3 19 B C,C 
3 20 C C 
3 21 C 
4 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 4 A A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 5 A A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 6 A A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 7 A A,A,A,A,A,A,A,A,A,B,B,B,C 
4 8 A A,A,A,A,A,A,A,A,B,B,B,C 
4 9 A A,A,A,A,A,A,A,B,B,B,C 
4 10 A A,A,A,A,A,A,B,B,B,C 
4 11 A A,A,A,A,A,B,B,B,C 
4 12 A A,A,A,A,B,B,B,C 
4 13 A A,A,A,B,B,B,C 
4 14 A A,A,B,B,B,C 
4 15 A A,B,B,B,C 
4 16 A B,B,B,C 
4 17 B B,B,C 
4 18 B B,C 
4 19 B C 
4 20 C 

위의 샘플을 생성하는 데 사용한 코드입니다. 내가 어디로 잘못 가고 있니?

CREATE TABLE #temp3 
     (
     Scenario INT 
     ,Vals VARCHAR(64) 
     ,LEN INT 
     ) 
     ; 
     WITH vals AS 
      (
      SELECT 
       v.* 
      FROM 
       (VALUES ('A'), ('B'), ('C')) v(x) 
      ), 
     CTE AS 
       (
       SELECT CAST('A' AS VARCHAR(MAX)) AS STR, 0 AS LEN 
       UNION ALL 
       SELECT (CTE.STR + ',' + vals.x), CTE.LEN + 1 
       FROM 
        CTE 
       JOIN vals 
        ON vals.x >= RIGHT(CTE.STR, 1) 
       WHERE CTE.LEN < 19 
       ) 
     INSERT INTO #temp3 
     SELECT 
      ROW_NUMBER() OVER(ORDER BY STR + ',C') AS Scenario 
      ,STR + ',C' AS Vals 
      ,LEN 
     FROM 
      CTE 
     WHERE 
      STR + 'C' LIKE '%B%' 
      AND LEN = 19 
      ; 

     -- Split strings created above into individual characters 

     WITH cte(Scenario, Value, Vals) AS 
     (
      SELECT 
       Scenario 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) AS Value 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') AS Vals 
      FROM #temp3 
      UNION ALL 
      SELECT 
       Scenario 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') 
      FROM cte 
      WHERE Vals > '' 
     ) 

     SELECT 
      Scenario 
      ,ROW_NUMBER() OVER (PARTITION BY Scenario ORDER BY Scenario) RowNumber 
      ,Value 
      ,Vals 
     FROM cte t 

답변

0

난 당신이 설명하는 문제가 무엇인지 정확히 모르겠어요,하지만 ROW_NUMBER()가 완전하게 각 파티션의 행을 주문 ORDER BY 절을 사용해야합니다.

"PARTITION BY 시나리오 ORDER BY 시나리오"를 사용하면 ROW_NUMBER() 값이 할당 된 순서가 정의되지 않습니다. 다음과 같이 시도하십시오.

WITH cte(Scenario, depth, Value, Vals) AS 
     (
      SELECT 
       Scenario, 0 depth 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) AS Value 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') AS Vals 
      FROM #temp3 
      UNION ALL 
      SELECT 
       Scenario, depth+1 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') 
      FROM cte 
      WHERE Vals > '' 
     ) 

     SELECT 
      Scenario 
      ,depth 
      ,ROW_NUMBER() OVER (PARTITION BY Scenario ORDER BY depth) RowNumber 
      ,Value 
      ,Vals 
     FROM cte t