ナレッジベース

条件に基づいた連続値のグループ化


発行: 16 Feb 2018
最終修正日: 13 Sep 2023

ご質問

条件を満たす連続値、つまり同じストリークに属するすべての値をグループ化する方法。

たとえば、利益がマイナスだった連続日数に基づいて、日のグループを作成します。行に利益がマイナスの 3 日間がある場合、それらの日はすべてグループ "3" に属します。

環境

  • Tableau Desktop
  • オプション: Tableau Prep

回答

サンプル データ セット スーパーストアを使用した次の手順は、ワークブック "running count groups_v2021.1.twbx" に説明されており、右側のペインからダウンロードできます。

これらの手順では、各グループ内のストリーク数をカウントするハイライト表を作成します。たとえば、データ セットにはマイナス利益の 3 日のストリークがいくつ含まれているかなどです。ワークブックにはクロス集計ビューとガント チャート ビューの作成の手順も含まれています。

オプション 1: Tableau Desktop で PREVIOUS_VALUE() を使用する

連続した日のグループの開始日を見つけるには、現在の日が条件を満たし (マイナスの利益がある)、前日が満たしていないかどうかを調べます。PREVIOUS_VALUE() 関数を使用すると、グループ内のすべての日に対して開始日値を繰り返すことができます。さらに、同様のプロセスで、ただし古い日から新しい日の順で読み取って、終了日を見つけることができます。

計算の作成

  1. オプション: "Profit no gaps (ギャップのない利益)" などの名前を付けて、次のような計算の計算フィールドを作成します。
    ZN(LOOKUP(SUM([Profit]),0))
    
    
    注: データ セットに日が欠落している場合、このステップにより、欠落している日をゼロの利益を持つものとして処理できます。このステップをスキップする場合は、後続のすべてのステップで [Profit no gaps (ギャップのない利益)] の代わりに SUM([Profit]) を使用します。
     
  2. "Start Date (開始日)" などの名前を付けて、次のような計算の計算フィールドを作成します。
        IF [Profit no gaps] >= 0
    	THEN NULL
    	
    	ELSEIF LOOKUP([Profit no gaps],-1) >= 0
    	THEN 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
    	THEN MIN([Order Date])
    	
    	ELSE PREVIOUS_VALUE(#1/1/18#)
    	END 
    
    
  5. "Days in Streak (ストリーク内の日)" などの名前を付けて、次のような計算の計算フィールドを作成します。
    	
        DATEDIFF('day', [Start Date], [End Date]) + 1
        
  6. "# of Streaks (ストリーク数)" などの名前を付けて、次のような計算の計算フィールドを作成します。
    
        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 (ストリーク グループあたり 1 日のみ維持)] には、ストリーク内の可能性のある日数ごとに条件を含める必要があります。理由の詳細については、「集計フィールドを使用してテーブル計算の詳細レベルを定義する」を参照してください。

  7. "Keep only one date per streak group (ストリーク グループあたり 1 日のみ維持)" などの名前を付けて、次のような計算の計算フィールドを作成します。
    
        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 (カテゴリー)] を [列] シェルフにドラッグします。
  2. [Order Date (オーダー日)] を右クリックして、[マーク] カードの [詳細] にドラッグします。
  3. [フィールドのドロップ] ダイアログで [MDY(Order Date) (月/日/年(注文日))] を選択して [OK] をクリックします。
  4. [Days in Streak (ストリーク内の日)] を [マーク] カードの [ラベル] にドラッグします。
  5. [ラベル] の [Days in Streak (ストリーク内の日)] を右クリックし、[表計算の編集] を選択します。
  6. [表計算] ダイアログで、次を実行します。
    1. [ネストされた計算] で [Start Date (開始日)] を選択します
    2. [次を使用して計算] で、[特定のディメンション] を選択します。
    3. [Order Date (オーダー日)] の [月]、[日]、[年] のみをチェックします
    4. [ネストされた計算] で、[Profit no gaps (ギャップのない利益)] を選択します
    5. [次を使用して計算] で、[特定のディメンション] を選択します。
    6. すべてのディメンションのチェックを外します
    7. [ネストされた計算] で、[Next Profit Value (次の利益値)] を選択します
    8. [次を使用して計算] で、[特定のディメンション] を選択します。
    9. [Order Date (オーダー日)] の [月]、[日]、[年] のみをチェックします
    10. [ネストされた計算] で [End Date (終了日)] を選択します
    11. [次を使用して計算] で、[特定のディメンション] を選択します。
    12. [Order Date (オーダー日)] の [月]、[日]、[年] のみをチェックします
    13. [並べ替え順序] ドロップダウンで、[Custom (カスタム)]、[Order Date (オーダー日)]、[Minimum (最小)]、Descending (降順)] を選択します
  7. [ラベル] から、Ctrl キーを押しながら [Days in Streak (ストリーク内の日)] を [行] シェルフにドラッグします
  8. [行] シェルフの [Days in Streak (ストリーク内の日)] を右クリックし、[不連続] を選択します
  9. [Keep only one day per streak group (ストリーク グループあたり 1 日のみ維持)] を [フィルター] シェルフにドラッグし、[OK] をクリックして [フィルター] ダイアログを閉じます。
  10. [フィルター] シェルフの [Keep only one day per streak group (ストリーク グループあたり 1 日のみ維持)] を右クリックし、[表計算の編集...] を選択します
  11. [表計算] ダイアログで、次を実行します。
    1. ステップ 6-1 から 6-13 を繰り返します
    2. [ネストされた計算] で [Keep only one date per streak group (ストリーク グループあたり 1 日のみ維持)] を選択します
    3. [次を使用して計算] で、[特定のディメンション] を選択します。
    4. [Order Date (オーダー日)] の [月]、[日]、[年] のみをチェックします
  12. [フィルター] シェルフの [Keep only one day per streak group (ストリーク グループあたり 1 日のみ維持)] を右クリックし、[フィルターの編集] を選択します[フィルター] ダイアログで [真] のみをチェックし、[OK] をクリックします
  13. [行] シェルフから、Ctrl キーを押しながら [Days in Streak (ストリーク内の日)] を [マーク] カードの [色] にドラッグします
  14. [マーク] カードのドロップダウン メニューで、[四角] を選択します。
  15. [マーク] カードの [サイズ] をクリックし、スライダーを右端まで調整します。
  16. "Blank (空白)" のような名前で、次のような計算の計算フィールドを作成します。
    
    ""
    
    
  17. [Blank (空白)] の 1 つのコピーを [行] シェルフにドラッグし、もう 1 つを [列] シェルフにドラッグします
  18. [行] シェルフの [空白] を右クリックし、[ヘッダーの表示] をオフにします。
 

オプション 2: Tableau Prep を使用する

Prep フローの作成は事前作業ですが、Prep 出力からのビューの作成は、表計算によるビューの作成と比較してはるかに簡単です。"Grouping Consequtive days.tflx" Prep フローでは、以下のステップを説明しており、右側のペインからダウンロードできます。

Prep フローの作成

  1. スーパーストアに接続し、[Orders (オーダー)] をキャンバスにドラッグします
  2. オプション:「シーケンシャル データのギャップを埋める」または「カテゴリーごとのシーケンシャル データのギャップを埋める」の手順に従って、データ セット内の欠落している日を埋めます
  3. "Main Branch (メイン分岐)" という名前のクリーニング ステップを作成します
  4. "Keep Only Fields (保持するフィールド)" という集計ステップを作成します
  5. "Keep Only Fields (保持するフィールド)" 集計フィールドで、[Category (カテゴリー)] と [Order Date (オーダー日)] を [グループ化したフィールド] に追加し、[SUM(Profit)] を [集計フィールド] に追加します
  6. "Row Number (行番号)" という名前のクリーニング ステップを作成します。
  7. "Row Number (行番号)" クリーニング ステップで、次の操作を行います。
    1. [計算フィールドの作成...] をクリックして、新しい計算を作成します
    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 Number + 1 (行番号 + 1)" という名前のクリーニング ステップを作成します。
  9. [行番号 + 1] クリーニング ステップで、次の操作を行います。
    1. 次のような式を使用して、"Row Number + 1 (行番号 + 1)" という名前の計算フィールドを作成します。 
      
      [Row Number] + 1
      
      
    2. [行番号] を削除します。
  10. "Row Number + 1 (行番号 + 1)" クリーニング ステップを "Row Number (行番号)" クリーニング ステップの上にドラッグし、[結合] にドロップします
  11. "Join 1 (結合 1)"結合ステップで、以下を実行します。
    1. Tableau Prep によって Condition = Condition に自動的に結合句が作成されます。作成されない場合はこの結合句を追加します
    2. [適用した結合句] セクションの左側の灰色のサイド パネルのプラス記号をクリックします。
    3. "Row Number (行番号)" メニューで、[Category (カテゴリー)] を選択します
    4. "Row Number + 1 (行番号 + 1)" メニューで、[Category (カテゴリー)] を選択します
    5. Row Number = Row Number + 1 に別の結合句を追加します。
    6. ベン図ですべての "Row Number (行番号)" の円を選択して、左外部結合を作成します
  12. "Start Date (開始日)" という名前のクリーニング ステップを作成します。
  13. "Start Date (開始日)" クリーニング ステップで、次の操作を行います。
    1. [Category (カテゴリー)] をクリックし、Ctrl キーを押しながら [Category-1 (カテゴリー-1)] をクリックして、両方のフィールドを選択します
    2. [フィールドのマージ] をクリックします
    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. [値のフィルター...] をクリックします
    6. [フィルターの追加] ダイアログで、NOT ISNULL([Start Date]) のような式を追加して、[保存] をクリックします
    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 (行番号 - 1)" という名前の新しいクリーニング ステップを作成します。
  15. 注: ステップ 15 から 19 はステップ 9 から 13 にとてもよく似ていますが、開始日ではなく終了日を見つけるためのいくつかの違いがあります。違いがあるため、"Start Date (開始日)" 分岐から計算フィールドをコピーしないでください。 "Row Number - 1 (行番号 - 1)" クリーニング ステップで、次の操作を行います。
    1. 次のような式を使用して、"Start Date Rank (開始日ランク)" という名前の新しい計算フィールドを作成します 
      
      
      [Row Number] - 1
      
      
    2. [行番号] を削除します。
  16. "Row Number - 1 (行番号 - 1)" クリーニング ステップを "Row Number (行番号)" クリーニング ステップの上にドラッグし、[結合] にドロップします
  17. "Join 2 (結合 2)" 結合ステップで、以下を実行します。
    1. Row Number = Row Number - 1; Category = Category; Condition = Condition に結合句を作成します
    2. ベン図ですべての "Row Number (行番号)" の円を選択して、左外部結合を作成します
  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. オプション: クリックしてドラッグし、サイド分岐のすべてのステップを選択して、ハイライトされたステップを右クリックし、[グループ] を選択します

ハイライト チャートの作成

  1. [Category (カテゴリー)] を [列] シェルフにドラッグします。
  2. [# of Continuous Days (連続日数)] を [行] シェルフにドラッグします
  3. [行] シェルフの [SUM(# of Continuous Days)] を右クリックし、[ディメンション] を選択します
  4. [列] シェルフの [# of Continuous Days (連続日数)] を右クリックし、[不連続] を選択します
  5. [Start Date (開始日)] を右クリックして [テキスト] にドラッグします
  6. [フィールドのドロップ] メニューで、[CNTD(Start Date)] を選択し、[OK] をクリックします
  7. [ラベル] から、Ctrl キーを押しながら [CNTD(Start Date)] を [マーク] カードの [色] にドラッグします
  8. [マーク] カードのドロップダウン メニューで、[四角] を選択します
  9. [Condition (条件)] を [フィルター] シェルフにドラッグします
  10. [フィルター] ダイアログで [negative (マイナス)] をチェックし、[OK] をクリックします
  11. '標準' という自動調整ドロップダウン メニューで、[幅を合わせる] を選択します

詳細情報

PREVIOUS_VALUE() を使用したオプション 1 に関するメモ
  • [Start Date (開始日)] 計算では、条件 (利益がマイナス) が満たされていない場合に、NULL を返します。次に計算では、条件が前日に満たされなかったかどうかを確認し、その場合はさらに古い日付値を返します。最後に現在の日と前日のどちらも条件を満たしている場合、計算では PREVIOUS_VALUE() を使用して、前の行のこの計算からの日付を返します。つまり、Tableau Desktop が各行 (または各日) を読み取ると、この計算では、NULL またはオーダー日のその値を返すか、または前に返したオーダー日の値を繰り返します。
  • 期待する値を表示するには、このビューのすべての表計算が正しく計算される必要があります。[次を使用して計算] 設定で表計算の結果を変更する方法の詳細については、「表計算での値の変換」を参照してください。
  • LOOKUP() と異なり、関数 PREVIOUS_VALUE() はこの計算の最後の値を返します。
Tableau Prep を使用したオプション 2 に関するメモ
  • Prep フロー出力には、条件 (マイナスの利益がある) を満たすグループと条件を満たさないグループの開始日が含まれます。フィルターを "Row Number (行番号)" クリーニング ステップに追加して、[Condition]='negative' のみを維持し、条件を満たさないグループを除外できます。そうでない場合は、[条件] フィルターをビューに追加する必要があります。

     

表計算での値の変換
表計算関数
この記事で問題は解決しましたか?