Kueri ini dimodifikasi dari yang saya tulis di sini:Analisis kohort dalam SQL
Inilah permintaan terakhir:
SELECT
STR_TO_DATE(CONCAT(tb.cohort, ' Monday'), '%X-%V %W') as date,
size,
w1,
w2,
w3,
w4,
w5,
w6,
w7
FROM (
SELECT u.cohort,
IFNULL(SUM(s.Offset = 0), 0) w1,
IFNULL(SUM(s.Offset = 1), 0) w2,
IFNULL(SUM(s.Offset = 2), 0) w3,
IFNULL(SUM(s.Offset = 3), 0) w4,
IFNULL(SUM(s.Offset = 4), 0) w5,
IFNULL(SUM(s.Offset = 5), 0) w6,
IFNULL(SUM(s.Offset = 6), 0) w7
FROM (
SELECT
UserId,
DATE_FORMAT(AddedDate, "%Y-%u") AS cohort
FROM users
) as u
LEFT JOIN (
SELECT DISTINCT
payments.UserId,
FLOOR(DATEDIFF(payments.PaymentDate, users.AddedDate)/7) AS Offset
FROM payments
LEFT JOIN users ON (users.UserId = payments.UserId)
) as s ON s.UserId = u.UserId
GROUP BY u.cohort
) as tb
LEFT JOIN (
SELECT DATE_FORMAT(AddedDate, "%Y-%u") dt, COUNT(*) size FROM users GROUP BY dt
) size ON tb.cohort = size.dt
Jadi intinya adalah kami mengambil pengguna dan tanggal mereka mendaftar dan memformat tanggal dengan nomor tahun-minggu, karena kami melakukan kelompok mingguan.
SELECT
UserId,
DATE_FORMAT(AddedDate, "%Y-%u") AS cohort
FROM users
Karena kita ingin mengelompokkan berdasarkan kohort, kita harus meletakkannya di subquery di bagian FROM dari kueri.
Kemudian kami ingin bergabung dengan informasi pembayaran pada pengguna.
SELECT DISTINCT
payments.UserId,
FLOOR(DATEDIFF(payments.PaymentDate, users.AddedDate)/7) AS Offset
FROM payments
LEFT JOIN users ON (users.UserId = payments.UserId)
Ini akan mendapatkan peristiwa pembayaran mingguan unik per pengguna dengan jumlah minggu mereka telah menjadi pengguna. Kami menggunakan perbedaan karena jika pengguna melakukan 2 pembelian dalam satu minggu, kami tidak ingin menghitungnya sebagai dua pengguna.
Kami tidak hanya menggunakan tabel pembayaran, karena beberapa pengguna mungkin mendaftar dan tidak memiliki pembayaran. Jadi kami memilih dari tabel pengguna dan bergabung di tabel pembayaran.
Anda kemudian mengelompokkan berdasarkan minggu - u.cohort. Kemudian Anda mengagregasi angka minggu untuk mengetahui berapa banyak orang yang melakukan pembayaran dalam minggu setelah mereka mendaftar.
Versi mysql yang saya gunakan memiliki sql_mode yang disetel ke only_full_group_by. Jadi untuk mendapatkan ukuran kohort, saya menempatkan sebagian besar kueri di subkueri sehingga saya dapat bergabung dengan pengguna untuk mendapatkan ukuran kohor.
Pertimbangan lebih lanjut:
Filter berdasarkan minggu itu sederhana. tb.cohort> tanggal mulai dan tb.cohort
Anda mungkin ingin mempertimbangkan untuk menggunakan tabel kalender untuk membahas kasus-kasus di mana tidak ada pengguna yang mendaftar selama seminggu.
Berikut biola dengan semuanya berfungsi:http://sqlfiddle.com/#!9/172dbe/ 1