Saya memiliki sejumlah besar data yang saya coba selesaikan. Di Kolom A, saya punya nama pengguna, di Kolom BI ada tanggal / waktu mulai sesi, di Kolom CI ada tanggal / waktu akhir sesi.
Saya mencoba menghitung berapa sesi bersamaan yang sedang berlangsung pada satu waktu berdasarkan akun pengguna. Titik sulit yang saya temui adalah bahwa satu pengguna dapat melakukan beberapa sesi sekaligus.
Sebagai contoh:
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
Kolom keempat menunjukkan hasil yang ingin saya hitung dengan rumus. Data di atas dapat ditampilkan secara grafis sebagai:
Seperti yang Anda lihat di akhir contoh (dan bagian bawah grafik), CT pengguna memiliki beberapa sesi sekaligus. Koneksi tersebut hanya akan dihitung sebagai satu lisensi.
Beri tahu saya jika saya perlu mengklarifikasi ini.
Jawaban:
Dengan asumsi data Anda di kolom
A
untukC
, mulai dari baris 2 maka Anda dapat menggunakan ini "array formula" diD2
=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))
dikonfirmasi dengan CTRL+ SHIFT+ ENTERdan menyalin kolom
Penjelasan:
Ini adalah teknik umum yang digunakan untuk mendapatkan hitungan nilai yang berbeda dalam satu kolom (dalam hal ini pengguna) di mana beberapa kriteria dipenuhi di kolom lain (dalam hal ini bahwa waktu mulai / tanggal terbaru adalah antara waktu mulai / tanggal dan akhir waktu / tanggal di kolom lain).
"Array data" untuk
FREQUENCY
adalah hasil dariMATCH
fungsi untuk baris di mana kriteria waktu dipenuhi - danMATCH
akan menemukan nilai yang cocok pertama , sehingga di mana Anda memiliki pengguna berulangMATCH
mengembalikan angka yang sama untuk masing-masing (dan Anda mendapatkanFALSE
untuk baris di mana kondisi tidak bertemu)The
FREQUENCY
"sampah" terdiri dari semua hasil yang mungkin untukMATCH
(1 sampai 15 dalam kasus ini), sehingga jika kondisi (yang saat band yang berisi waktu mulai terbaru) terpenuhi dan pengguna adalah sama, jumlah yang sama dikembalikan dalam array data dan berjalan dalambin
...... yang sama sehingga cukup untuk menghitung jumlah sampah yang> 0 untuk mendapatkan jumlah pengguna yang berbeda.Khusus untuk baris 2, misalnya, array data menjadi ini:
{1;2;3;4;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}
dan 4 nilai berbeda dikembalikan ke 4 tempat sampah berbeda sehingga Anda mendapatkan hasil 4
.... tetapi untuk baris 10 array data menjadi ini:
{FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;9;9;FALSE;9;FALSE;FALSE;FALSE}
di mana ada 3 baris yang cocok dengan kondisi waktu ..... tetapi semua untuk pengguna yang sama (
CT
), sehinggaMATCH
fungsi mengembalikan 9 (posisi entri "CT" pertama diA2:A16
) untuk ketiganya, sehingga kemudianFREQUENCY
mendapatkan 3 nilai di tempat sampah yang sama, jadi rumusnya memutuskan untuk ini:=SUM(IF({0;0;0;0;0;0;0;0;3;0;0;0;0;0;0;0},1))
The
IF
mengembalikan fungsi 1 untuk setiap nilai bukan nol dalam array dikembalikan olehFREQUENCY
danSUM
merangkum mereka 1s ..... tapi hanya ada satu nilai non-nol sehingga hasilnya1
(mewakili jumlah pengguna yang berbeda dengan sesi terbuka pada waktu itu )Lihat tangkapan layar terlampir
sumber
Inilah formula yang jauh lebih pendek dan sederhana yang menghasilkan hasil yang diinginkan
Langkah pertama adalah untuk mengetahui bahwa interval Mulai 1 / Akhir 1 tumpang tindih interval Mulai 2 / Akhir 2 jika dan hanya jika Mulai 1 <Akhir 2 dan Akhir 1 > Mulai 2 . (Ini mudah dilihat apakah Anda memikirkannya; lebih mudah jika Anda menggambarnya.)
barry houdini menggunakan ≤ dan ≥ , jadi saya akan menggunakan konvensi yang sama. AFAICT, tidak ada contoh dalam dataset contoh di mana waktu mulai atau akhir dari satu sesi persis bertepatan dengan waktu mulai atau berakhirnya sesi milik pengguna yang berbeda, jadi perbedaan dalam pendekatan ini seharusnya tidak menghasilkan hasil yang berbeda (misalnya Himpunan data).
Jadi, untuk setiap baris, kami ingin menghitung baris di bawah ini dalam catatan awal / akhir yang benar di atas, dan ID Pengguna tidak sama dengan ID Pengguna untuk baris ini. Dan tambahkan 1. Itu sederhana
Perhatikan bahwa saya menetapkan rentang untuk beralih dari baris saat ini (direpresentasikan sebagai Baris 2, berisi sel
A2
,B2
danC2
) ke nomor baris absolut 16 (diwakili sebagai Baris $ 16, berisi selA16
,B16
danC16
). Ini menyebabkan hanyaCOUNTIF
untuk melihat baris saat ini dan yang berikut. Dan perhatikan bahwa ini bukan formula array.Saya akan memposting tangkapan layar, tapi itu akan (secara efektif) identik dengan milik barry, dan karenanya membuang-buang bandwidth.
sumber