web-dev-qa-db-ja.com

開始/終了時間に基づいて同時セッションの数をカウントするExcel

処理しようとしている大量のデータセットがあります。列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番目の列は、数式で計算できるようにしたい結果を示しています。上記のデータは、次のようにグラフィカルに表示できます。

bar chart

例の最後(およびグラフの下部)に示されているように、ユーザーCTでは一度に複数のセッションが実行されます。これらの接続は、1つのライセンスとしてのみカウントされます。

これを明確にする必要がある場合はお知らせください。

3
user439742

データが列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関数の結果であり、MATCHfirst一致する値。したがって、リピーターがいる場合、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_(その時点でセッションが開いているさまざまなユーザーの数を表します)

添付のスクリーンショットを参照してください

enter image description here

5
barry houdini

これは、目的の結果を生成する、はるかに短く単純な式です。

  • この行より下の行数
    • 時間範囲が重複し、
    • ユーザーが違う
  • 一を足す。

最初のステップは、その間隔を把握することです開始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として表され、セルA2B2、およびC2を含む)から絶対行番号16(Row $ 16として表され、以下を含む)までの範囲を定義したことに注意してください。セルA16B16およびC16)。これにより、COUNTIFは現在の行と次の行のみを検索します。そして、これはnot配列数式であることに注意してください。

スクリーンショットを投稿しますが、それは(事実上)バリーと同じであるため、帯域幅が無駄になります。

0
Scott