기술 자료

조건 기반 연속 값 그룹화하기


게시 날짜: 16 Feb 2018
마지막 수정 날짜: 13 Sep 2023

질문

조건을 충족하는 연속 값, 즉 같은 연속에 속하는 모든 값을 그룹화하는 방법은 무엇인가요?

예를 들어 연속으로 수익이 음수였던 일수를 기반으로 일 그룹을 만듭니다. 연속으로 수익이 음수였던 날이 3일이라면 그 날들은 그룹 "3"에 속합니다.

환경

  • Tableau Desktop
  • 선택 사항: Tableau Prep

답변

샘플 데이터 집합 Superstore를 사용하는 다음 지침은 통합 문서 "running count groups_v2021.1.twbx"에서 시연되며, 이는 오른쪽 패널에서 다운로드할 수 있습니다.

이 지침에서는 각 그룹에서 연속 수를 카운트하는 하이라이트 테이블을 만듭니다. 예를 들면 데이터 집합에 3일 연속 수익이 음수인 사례는 몇 개인가요? 또한 통합 문서에는 크로스탭 뷰와 Gantt 차트 뷰를 만들기 위한 지침도 포함되어 있습니다.

옵션 1: Tableau Desktop에서 PREVIOUS_VALUE() 사용

현재 일이 조건(수익이 음수)을 충족하고 이전 일이 충족하지 않는지를 확인하여 연속 일 그룹의 시작 날짜를 찾을 수 있습니다. PREVIOUS_VALUE() 함수를 사용하여 그룹 내에서 매일에 대한 시작 날짜 값을 반복할 수 있습니다. 그런 다음 이와 유사하지만 데이터를 이전 날짜부터 최신 날짜 순으로 읽는 프로세스로 종료 날짜를 찾을 수 있습니다.

계산 만들기

  1. 선택 사항: 다음과 유사한 계산을 사용하여 "Profit no Gaps"라는 이름의 계산된 필드를 만듭니다.
    ZN(LOOKUP(SUM([Profit]),0))
    
    
    참고: 데이터 집합에 누락된 날짜가 있는 경우 이 단계는 누락된 날짜의 수익을 0으로 처리합니다. 이 단계를 건너뛰는 경우 다음 단계 전체에서 [Profit no gaps(수익 차이 없음)] 대신 SUM([Profit])을 사용합니다.
     
  2. "Start Date"라는 이름으로 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
        IF [Profit no gaps] >= 0
    	THEN NULL
    	
    	ELSEIF LOOKUP([Profit no gaps],-1) >= 0
    	MIN([Order Date])\}
    	
    	ELSE PREVIOUS_VALUE(#1/1/18#)
    	END
    
    
  3. "Next Profit Value"라는 이름으로 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
    
        LOOKUP([Profit no gaps],1)
        
  4. "End Date"라는 이름으로 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
    
    	IF [Profit no gaps] >= 0
    	THEN NULL
    	
    	ELSEIF [Next Profit Value] >= 0
    	MIN([Order Date])\}
    	
    	ELSE PREVIOUS_VALUE(#1/1/18#)
    	END 
    
    
  5. "Days in Streak"이라는 이름으로 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
    	
        DATEDIFF('day', [Start Date], [End Date]) + 1
        
  6. "# of Streak"이라는 이름으로 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
    
        IF [Days in Streak] = 1 THEN
    	    WINDOW_SUM(
    	    IF [Days in Streak] = 1
    	    THEN COUNTD([Order Date])
    	    END
    	    )
    	ELSEIF [Days in Streak] = 2 THEN
    	    WINDOW_SUM(
    	    IF [Days in Streak] = 2
    	    THEN COUNTD([Order Date])
    	    END
    	    )
    	ELSEIF [Days in Streak] = 3 THEN
    	    WINDOW_SUM(
    	    IF [Days in Streak] = 3
    	    THEN COUNTD([Order Date])
    	    END
    	    )
    	ELSEIF ...
    	END / [Days in Streak]    
     

    참고: 계산된 필드 [# of Streaks(연속 개수)] 및 [Keep only one date per streak group(연속 그룹당 하나의 날짜만 유지)]은 모든 가능한 연속 일수의 조건을 포함해야 합니다. 그 이유에 대한 추가 설명은 집계 필드를 사용하여 테이블 계산에서 세부 수준 정의를 참조하세요.

  7. "Keep only one date per streak group"이라는 이름으로 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
    
        MIN([Order Date]) = WINDOW_MIN(IF[Days in Streak] = 1 THEN [Start Date] END)
    	OR MIN([Order Date]) = WINDOW_MIN(IF[Days in Streak] = 2 THEN [Start Date] END)
    	OR MIN([Order Date]) = WINDOW_MIN(IF[Days in Streak] = 3 THEN [Start Date] END)
    	OR ...
    


하이라이트 테이블을 만듭니다.

  1. [Category(범주)]를 Columns(열) 선반으로 끌어옵니다.
  2. [Order Date(주문 날짜)]를 마우스 오른쪽 단추로 클릭하고 Marks(마크) 카드의 Detail(세부 정보)로 끌어옵니다.
  3. 필드 놓기 대화 상자에서 MDY(Order Date)를 선택하고 확인을 클릭합니다.
  4. [Days in Streak(연속 일수)]를 Marks(마크) 카드의 Label(레이블)로 끌어옵니다.
  5. Label(레이블)의 [Days in Streak(연속 일수)]를 마우스 오른쪽 단추로 클릭하고 Edit Table Calculation...(테이블 계산 편집...)을 선택합니다.
  6. 테이블 계산 대화 상자에서 다음 작업을 수행합니다.
    1. Nested Calculations(중첩된 계산)에서 Start Date(시작 날짜)를 선택합니다.
    2. 다음을 사용하여 계산에서 특정 차원을 선택합니다. 
    3. 주문 월, 일, 연도만 확인합니다.
    4. Nested Calculations(중첩된 계산)에서 Profit no gaps(수익 차이 없음)를 선택합니다.
    5. 다음을 사용하여 계산에서 특정 차원을 선택합니다. 
    6. 모든 차원을 선택 해제합니다.
    7. Nested Calculations(중첩된 계산)에서 Next Profit Value(다음 수익 값)를 선택합니다.
    8. 다음을 사용하여 계산에서 특정 차원을 선택합니다. 
    9. 주문 월, 일, 연도만 확인합니다.
    10. Nested Calculations(중첩된 계산)에서 End Date(종료 날짜)를 선택합니다.
    11. 다음을 사용하여 계산에서 특정 차원을 선택합니다. 
    12. 주문 월, 일, 연도만 확인합니다.
    13. Sort Oder(정렬 순서) 드롭다운에서 Custom(사용자 지정), Order Date(주문 날짜), Minimum(최소), Descending(내림차순)을 선택합니다.
  7. Ctrl을 누르고 [Days in Streak(연속 일수)]을 레이블에서 Rows(행) 선반으로 끌어옵니다.
  8. Rows(행) 선반에서 [Days in Streak(연속 일수)]을 마우스 오른쪽 단추로 클릭하고 Discrete(불연속형)를 선택합니다.
  9. [Keep only one day per streak group(연속 그룹당 하루만 유지)]을 Filters(필터) 선반으로 끌어오고 OK(확인)를 클릭하여 필터 대화 상자를 닫습니다.
  10. Filters(필터) 선반에서 [Keep only one day per streak group(연속 그룹당 하루만 유지)]을 마우스 오른쪽 단추로 클릭하고 Edit Table Calculation...(테이블 계산 편집...)을 선택합니다.
  11. 테이블 계산 대화 상자에서 다음 작업을 수행합니다.
    1. 6-1단계부터 6-13단계까지 반복합니다.
    2. Nested Calculations(중첩된 계산)에서 Keep only one day per streak group(연속 그룹당 하루만 유지)을 선택합니다.
    3. 다음을 사용하여 계산에서 특정 차원을 선택합니다. 
    4. 주문 월, 일, 연도만 확인합니다.
  12. Filters(필터) 선반에서 [Keep only one day per streak group(연속 그룹당 하루만 유지)]을 마우스 오른쪽 단추로 클릭하고 Edit Filter(필터 편집)를 선택합니다. Filter(필터) 대화 상자에서 True(참)만 선택하고 OK(확인)를 클릭합니다.
  13. Ctrl을 누르고 [Days in Streak(연속 일수)]를 행(Rows) 선반에서 Marks(마크) 카드의 Color(색상)로 끌어옵니다.
  14. Marks(마크) 카드의 드롭다운에서 Square(정사각형)를 선택합니다.
  15. Marks(마크) 카드에서 Size(크기)를 클릭하고 슬라이더를 오른쪽 끝으로 조정합니다.
  16. "Blank"라는 이름 및 다음과 유사한 계산을 사용하여 계산된 필드를 만듭니다.
    
    ""
    
    
  17. [Blank] 사본 하나를 Rows(행) 선반으로, 다른 하나를 Columns(열) 선반으로 끌어옵니다.
  18. 행 선반에서 [Blank]를 마우스 오른쪽 단추로 클릭하고 머리글 표시를 선택 취소합니다.
 

옵션 2: Tableau Prep 사용

준비 흐름을 만드는 것은 보다 사전에 수행하는 작업이지만 준비 출력에서 뷰를 만드는 것은 테이블 계산으로 뷰를 만드는 것보다 훨씬 간단합니다. "Grouping Consequtive days.tflx" 준비 흐름은 다음 단계를 시연하며 오른쪽 패널에서 다운로드할 수 있습니다.

준비 흐름 만들기

  1. Superstore를 연결하고 주문을 캔버스에 연결합니다.
  2. 선택 사항: 순차적 데이터의 간격 채우기 또는 범주별 순차적 데이터의 간격 채우기의 지침에 따라 데이터 집합에서 누락된 날을 채웁니다.
  3. "Main Branch"라는 이름의 정리 단계를 만듭니다.
  4. "Keep Only Fields"라는 이름의 집계 단계를 만듭니다.
  5. "Keep Only Fields" 집계 단계에서 그룹화된 필드에 Category(범주)와 Order Date(주문 날짜)를 추가하고 집계 필드에 SUM(Profit)을 추가합니다.
  6. "Row Number"라는 이름의 정리 단계를 만듭니다.
  7. "Row Number" 정리 단계에서 다음을 수행합니다.
    1. Create Calculated Field...(계산된 필드 만들기...)를 클릭하여 새 계산을 만듭니다.
    2. 계산을 "Condition"으로 명명합니다.
    3. 날짜 그룹화에 사용되는 조건에 대한 수식을 추가합니다. 예를 들어
      
      IF [Profit] < 0
      THEN 'negative'
      ELSE 'positive'
      END
      
      
    4. 다음과 같은 수식을 사용하여 이름이 "Row Number"인 새 계산된 필드를 만듭니다.
      
      { PARTITION [Category], [Condition] : { ORDERBY [Order Date] ASC : RANK_DENSE()}}
      
  8. 정리 단계를 만들고 이름을 "Row Numbe + 1"로 지정합니다.
  9. "Row Number(행 번호) + 1" 정리 단계에서 다음을 수행합니다.
    1. 다음과 같은 수식을 사용하여 이름이 "Row Number(행 번호) + 1"인 새 계산된 필드를 만듭니다. 
      
      [Row Number(행 번호)] + 1
      
      
    2. [Row Number(행 번호)]를 제거합니다.
  10. "Row Number(행 번호) + 1" 정리 단계를 "Row Number(행 번호)" 정리 단계 위로 끌어와 조인에 놓습니다.
  11. "Join 1(조인 1)" 단계에서 다음을 수행합니다.
    1. Tableau Prep은 Condition = Condition 시 조인 절을 자동으로 생성하며, 아니면 이 조인 절을 추가합니다.
    2. 적용된 조인 절의 왼쪽 회색 사이드 패널에서 더하기를 클릭합니다.
    3. "Row Number(행 번호)" 메뉴에서 Category(범주)를 선택합니다.
    4. "Row Number(행 번호) + 1" 메뉴에서 Category(범주)를 선택합니다.
    5. Row Number = Row Number + 1 시 조인 절을 추가합니다.
    6. 벤 다이어그램에서 모든 "Row Number(행 번호)" 원을 선택하여 Left 조인을 만듭니다.
  12. 정리 단계를 만들고 이름을 "Start Date(시작 날짜)"로 지정합니다.
  13. "Start Date(시작 날짜)" 정리 단계에서 다음을 수행합니다.
    1. [Category(범주)]를 클릭하고 [Category-1(범주-1)]을 Ctrl을 누르고 클릭한 채로 두 필드를 선택합니다.
    2. Merge Fields(필드 병합)를 클릭합니다.
    3. [Condition(조건)]과 [Condition-1(조건-1)]을 병합합니다.
    4. 다음과 같은 수식을 사용하여 이름이 "Start Date"인 새 계산된 필드를 만듭니다. 
      
      IF ISNULL(DATEDIFF('day', [Order Date-1], [Order Date]))
      OR DATEDIFF('day', [Order Date-1], [Order Date]) > 1
      THEN [Order Date]
      END
      
      
    5. Filter Values...(값 필터링...)를 클릭합니다.
    6. Add Filter(필터 추가) 대화 상자에서 NOT ISNULL([Start Date])와 유사한 수식을 추가하고 Save(저장)를 클릭합니다.
    7. 다음과 같은 수식을 사용하여 이름이 "Start Date Rank"인 새 계산된 필드를 만듭니다. 
      { PARTITION [Category], [Condition] : { ORDERBY [Start Date] ASC : RANK_DENSE()}}
      
      
    8. [Row Number(행 번호)], [Row Number + 1(행 번호 + 1)], [Order Date(주문 날짜)], [Order Date-1(주문 날짜-1)]을 제거합니다.
  14. "Row Number(행 번호)" 정리 단계에 마우스오버하고 단계의 더하기 기호(라인에 포함된 더하기 기호가 아님)를 클릭하여 "Row Number(행 번호) - 1"이라는 새 정리 단계를 만듭니다. 그러면 별도의 분기가 생깁니다.
  15. 참고: 15~19단계는 9~13단계와 매우 유사하지만 시작 날짜가 아니라 종료 날짜를 찾는다는 차이점이 있습니다. 차이가 있으므로 "Start Date" 분기에서 계산된 필드를 복사하면 안 됩니다. "Row Number(행 번호) - 1" 정리 단계에서 다음을 수행합니다.
    1. 다음과 같은 수식을 사용하여 이름이 "Start Date Rank"인 새 계산된 필드를 만듭니다. 
      
      
      [Row Number] - 1
      
      
    2. [Row Number(행 번호)]를 제거합니다.
  16. "Row Number(행 번호) - 1" 정리 단계를 "Row Number(행 번호)" 정리 단계 위로 끌어와 조인에 놓습니다.
  17. "Join 2" 단계에서 다음을 수행합니다.
    1. Row Number = Row Number - 1; Category = Category; Condition = Condition에 조인 절을 만듭니다.
    2. 벤 다이어그램에서 모든 "Row Number(행 번호)" 원을 선택하여 Left 조인을 만듭니다.
  18. 정리 단계를 만들고 이름을 "End Date"로 지정합니다.
  19. "End Date(종료 날짜)" 정리 단계에서 다음을 수행합니다.
    1. [Category(범주)]와 [Category-1(범주-1)]을 병합합니다. 
    2. [Condition(조건)]과 [Condition-1(조건-1)]을 병합합니다.
    3. 다음과 같은 수식을 사용하여 이름이 "End Date"인 새 계산된 필드를 만듭니다.
      
      IF ISNULL(DATEDIFF('day', [Order Date], [Order Date-1]))
      OR DATEDIFF('day', [Order Date], [Order Date-1]) > 1
      THEN [Order Date]
      END
      
      
    4. NOT ISNULL([End Date])와 유사한 수식으로 필터를 추가합니다.
    5. 다음과 같은 수식을 사용하여 이름이 "End Date Rank"인 새 계산된 필드를 만듭니다. 
      
      { PARTITION [Category], [Condition] : { ORDERBY [End Date] ASC: RANK_DENSE()}}
      
      
    6. [Row Number(행 번호)], [Row Number + 1(행 번호 + 1)], [Order Date(주문 날짜)], [Order Date-1(주문 날짜-1)]을 제거합니다.
  20. "End Date(종료 날짜)" 정리 단계를 "Start Date(시작 날짜)" 정리 단계로 끌어서 조인 위에 놓습니다.
  21. Join 3(조인 3)에서 Condition = Condition; Category = Category; End Date Rank = Start Date Rank에 대한 조인 절을 만듭니다.
  22. 정리 단계를 만들고 이름을 "Clean Up"으로 지정합니다.
  23. "Clean Up(클린 업)" 정리 단계에서 다음을 수행합니다.
    1. [Category(범주)]와 [Category-1(범주-1)]을 병합합니다.
    2. [Condition(조건)]과 [Condition-1(조건-1)]을 병합합니다.
    3. 다음과 같은 수식을 사용하여 이름이 "# of Continuous Days"인 새 계산된 필드를 만듭니다. 
      
      DATEDIFF('day', [Start Date],[End Date])+1
      
      
    4. [Start Date Rank(시작 날짜 순위)] 및 [End Date Rank(종료 날짜 순위)]를 제거합니다.
  24. "Clean up(클린 업)" 정리 단계를 "Main Branch(기본 분기)" 정리 단계 위로 끌어서 조인에 놓습니다.
  25. Join 4(조인 4)에서 Category = Category; Order Date >= Start Date; Order Date <= End Date에 대한 조인 절을 만듭니다.
  26. 정리 단계를 만들고 이름을 "Final Clean Up"으로 지정합니다.
  27. "Final Clean Up(최종 클린 업)" 정리 단계에서 다음을 수행합니다.
    1. [Category(범주)]와 [Category-1(범주-1)]을 병합합니다.
  28. 선택 사항: 클릭하고 끌어서 측면 분기의 모든 단계를 선택하고 하이라이트된 단계를 마우스 오른쪽 단추로 클릭한 다음 Group(그룹)을 선택합니다.

하이라이트 차트 만들기

  1. [Category(범주)]를 Columns(열) 선반으로 끌어옵니다.
  2. [# of Continuous Days(연속 일수)]를 Rows(행) 선반으로 끌어옵니다.
  3. Rows(행) 선반의 SUM(# of Continuous Days)를 마우스 오른쪽 단추로 클릭하고 Dimension(차원)을 선택합니다.
  4. Rows(행) 선반의 [# of Continuous Days(연속 일수)]를 마우스 오른쪽 단추로 클릭하고 Discrete(불연속형)를 선택합니다.
  5. [Start Date(시작 날짜)]를 마우스 오른쪽 단추로 클릭하고 Text(텍스트)로 끌어옵니다.
  6. Drop Field(필드 놓기) 메뉴에서 CNTD(Start Date)를 선택하고 OK(확인)를 클릭합니다.
  7. Ctrl을 누르고 CNTD(Start Date)를 Label(레이블)에서 Marks(마크) 카드의 Color(색상)으로 끌어옵니다.
  8. Marks(마크) 카드의 드롭다운 메뉴에서 Square(정사각형)를 선택합니다.
  9. [Condition(조건)]을 Filters(필터) 선반으로 끌어옵니다.
  10. Filter(필터) 대화 상자에서 음수를 선택하고 OK(확인)를 클릭합니다.
  11. 'Standard(표준)' 맞춤 드롭다운 메뉴에서 'Fit Width(너비 맞추기)'를 선택합니다.

추가 정보

PREVIOUS_VALUE()를 사용하는 옵션 1에 대한 참고
  • [Start Date(시작 날짜)] 계산은 조건(수익이 음수)이 충족되지 않으면 NULL을 반환합니다. 그런 다음 계산은 이전 일 조건이 충족되지 않았는지 확인하고 만약 그렇다면 주문 날짜 값을 반환합니다. 마지막으로 현재 일과 이전 일이 모두 조건을 충족하는 경우 계산은 PREVIOUS_VALUE()를 사용하여 이전 행의 이 계산으로부터 날짜를 반환합니다. 다시 말해 Tableau Desktop이 모든 행(즉 모든 날짜)을 읽는 동안 이 계산은 NULL, 주문 날짜의 값을 반환하거나 이전에 반환한 주문 날짜의 값을 반복합니다.
  • 이 뷰의 모든 테이블 계산이 올바르게 계산되어야 예상된 값이 표시됩니다. 다음을 사용하셔 계산 설정으로 테이블 계산의 결과를 변경하는 방법에 대한 추가 정보는 테이블 계산으로 값 변환을 참조하세요.
  • LOOKUP()과 달리 PREVIOUS_VALUE() 함수는 계산의 마지막 값을 반환합니다.
Tableau Prep을 사용하는 옵션 2에 대한 참고:
  • 준비 흐름 출력에는 조건(수익이 음수)에 부합하는 그룹과 조건에 부합하지 않는 그룹에 대한 시작 날짜가 포함됩니다. 필터를 "행 번호" 정리 단계에 추가하여 [Condition]='negative'만 남기고 조건에 부합하지 않는 그룹을 제외할 수 있습니다. 아니면 뷰에 [Condition(조건)] 필터를 추가해야 합니다.

     

테이블 계산으로 값 변환
테이블 계산 함수
이 문서로 문제가 해결되었습니까?