Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana saya bisa membuat tabel analisis kelompok mingguan menggunakan mysql?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql join memberikan baris duplikat

  2. klausa bersyarat drupal sql untuk banyak tabel?

  3. Bergabunglah dengan dua tabel di MySQL, kembalikan hanya satu baris dari tabel kedua

  4. Ulasan Produk – Perbaikan Stellar untuk MySQL

  5. Bagaimana mencegah mySQL mengatur ulang nilai kenaikan otomatis?