処理しようとしている大量のデータセットがあります。列Aにはユーザー名があり、列Bにはセッションの開始日時があり、列Cにはセッションの終了日時があります。
ユーザーアカウントに基づいて、一度に進行中の同時セッションの数をカウントしようとしています。私が直面している困難な点は、1人のユーザーが一度に複数のセッションを実行できることです。
例えば:
User Start Time End Time Desired Result (license count)
JW 03/24/2015 14:00:44 03/24/2015 14:09:57 --> 4
TT 03/24/2015 13:58:14 03/24/2015 14:21:08 --> 3
DQ 03/24/2015 13:53:10 03/24/2015 14:15:39 --> 3
BB 03/24/2015 13:50:55 03/24/2015 14:20:42 --> 2
BA 03/24/2015 13:43:02 03/24/2015 13:57:26 --> 2
JW 03/24/2015 13:40:30 03/24/2015 13:48:38 --> 1
BA 03/24/2015 13:18:26 03/24/2015 13:18:44 --> 1
BA 03/24/2015 13:15:18 03/24/2015 13:15:22 --> 1
CT 03/24/2015 11:56:55 03/24/2015 11:58:21 --> 1
CT 03/24/2015 11:53:23 03/24/2015 11:56:55 --> 1
CT 03/24/2015 11:51:50 03/24/2015 11:53:23 --> 1
CT 03/24/2015 11:48:11 03/24/2015 12:16:36 --> 1
CT 03/24/2015 11:36:54 03/24/2015 11:37:50 --> 1
CT 03/24/2015 11:33:52 03/24/2015 11:39:38 --> 1
CT 03/24/2015 11:31:25 03/24/2015 11:34:01 --> 1
4番目の列は、数式で計算できるようにしたい結果を示しています。上記のデータは、次のようにグラフィカルに表示できます。
例の最後(およびグラフの下部)に示されているように、ユーザーCTでは一度に複数のセッションが実行されます。これらの接続は、1つのライセンスとしてのみカウントされます。
これを明確にする必要がある場合はお知らせください。
データが列A
からC
にあり、行2から始まるとすると、この「配列数式」を_D2
_で使用できます。
=SUM(IF(FREQUENCY(IF(B$2:B$16<=B2,IF(C$2:C$16>=B2,MATCH(A$2:A$16,A$2:A$16,0))),ROW(A$2:A$16)-ROW(A$2)+1),1))
で確認 CTRL+SHIFT+ENTER 列をコピーしました
説明:
これは、1つの列(この場合はユーザー)でさまざまな値のカウントを取得するために使用される一般的な手法であり、他の列でいくつかの基準が満たされています(この場合、最新の開始時刻/日付は開始時刻/日付と終了の間にあります)他の列の時刻/日付)。
FREQUENCY
の「データ配列」は、時間基準が満たされている行のMATCH
関数の結果であり、MATCH
はfirst一致する値。したがって、リピーターがいる場合、MATCH
はそれぞれに同じ番号を返します(条件がない行ではFALSE
を取得します)会った)
FREQUENCY
"bins"は、MATCH
(この場合は1から15)のすべての可能な結果で構成されているため、条件(時間帯に最新の開始時刻が含まれている)が満たされ、ユーザーは同じで、同じ番号がデータ配列に返され、同じbin
....になります。 。したがって、異なるユーザーの数を取得するには、0より大きいビンの数を数えるだけで十分です。
特に行2の場合、たとえば、データ配列は次のようになります。
_{1;2;3;4;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}
_
そして、4つの異なる値が4つの異なるビンに返されるため、4の結果が得られます。
....ただし、行10の場合、データ配列は次のようになります。
_{FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;9;9;FALSE;9;FALSE;FALSE;FALSE}
_
ここで、時間条件に一致する3つの行がありますが、すべて同じユーザー(CT
)であるため、MATCH
関数は9(最初の「CT」の位置)を返します。 3つすべての_A2:A16
_)にエントリがあるため、FREQUENCY
は同じビンに3つの値を取得するため、式は次のように解決されます。
=SUM(IF({0;0;0;0;0;0;0;0;3;0;0;0;0;0;0;0},1))
IF
関数は、FREQUENCY
によって返される配列内のゼロ以外の値ごとに1を返し、SUM
はそれらの1を合計します.....ただし、ゼロ以外の値は1つだけです。値なので、結果は_1
_(その時点でセッションが開いているさまざまなユーザーの数を表します)
添付のスクリーンショットを参照してください
これは、目的の結果を生成する、はるかに短く単純な式です。
最初のステップは、その間隔を把握することです開始1/終わり1 オーバーラップ間隔開始2/終わり2 開始した場合のみ1<終了2 そして終わり1>開始2。 (これは、考えれば見やすく、描くと見やすくなります。)
barry houdiniは≤と≥を使用 なので、同じ規則を使用します。 AFAICT、サンプルデータセットには、あるセッションの開始時刻または終了時刻が別のユーザーに属するセッションの開始時刻または終了時刻と正確に一致するインスタンスはないため、このアプローチの違いによって異なる結果が得られることはありません(例の場合)データセット)。
したがって、各行について、上記が当てはまる開始/終了レコードでこの行より下の行をカウントする必要があり、UserIDはこの行のUserIDと等しくありません。そして1を追加します。それは単に
=COUNTIFS(B2:B$16, "<="&C2, C2:C$16, ">="&B2, A2:A$16, "<>"&A2) + 1
現在の行(Row2として表され、セルA2
、B2
、およびC2
を含む)から絶対行番号16(Row $ 16として表され、以下を含む)までの範囲を定義したことに注意してください。セルA16
、B16
およびC16
)。これにより、COUNTIF
は現在の行と次の行のみを検索します。そして、これはnot配列数式であることに注意してください。
スクリーンショットを投稿しますが、それは(事実上)バリーと同じであるため、帯域幅が無駄になります。