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

Menghadiri Streak MySQL Query

Mari kita asumsikan tabel Anda adalah Event dan kolomnya adalah EventID dan Name . Kita dapat menentukan urutan (yaitu, 1, 2, 3, dll.) di mana setiap orang menghadiri acara dengan kueri berikut:

SELECT
  e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
  Event e1
    INNER JOIN
  Event e2
    ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
  e1.Name, e1.EventID

Kami dapat memanfaatkan PersonalEventSequence untuk mengelompokkan acara setiap orang ke dalam garis-garis:

SELECT
  Name, EventID - PersonalEventSequence AS StreakGroup
FROM
  (
    SELECT
      e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
    FROM
      Event e1
        INNER JOIN
      Event e2
        ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
    GROUP BY
      e1.Name, e1.EventID
  ) AS SubQuery1

Sekarang setelah peristiwa setiap orang dikelompokkan menjadi garis-garis (memiliki nomor StreakGroup yang memang aneh!), kita dapat menentukan panjang garis setiap orang:

SELECT
  Name, StreakGroup, COUNT(*) AS StreakLength
FROM
  (
    SELECT
      Name, EventID - PersonalEventSequence AS StreakGroup
    FROM
      (
        SELECT
          e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
        FROM
          Event e1
            INNER JOIN
          Event e2
            ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
        GROUP BY
          e1.Name, e1.EventID
      ) AS SubQuery1
  ) SubQuery2
GROUP BY
  Name, StreakGroup

Sekarang setelah kita mengetahui panjang guratan setiap orang, kita dapat menentukan panjang guratan terpanjang setiap orang:

SELECT
  Name, MAX(StreakLength) AS PersonalRecordStreakLength
FROM
  (
    SELECT
      Name, StreakGroup, COUNT(*) AS StreakLength
    FROM
      (
        SELECT
          Name, EventID - PersonalEventSequence AS StreakGroup
        FROM
          (
            SELECT
              e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
            FROM
              Event e1
                INNER JOIN
              Event e2
                ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
            GROUP BY
              e1.Name, e1.EventID
          ) AS SubQuery1
      ) SubQuery2
    GROUP BY
      Name, StreakGroup
  ) SubQuery3
GROUP BY
  Name

Catatan:

  • OP hanya menginginkan coretan saat ini (yaitu coretan yang menyertakan peristiwa terbaru), tetapi saya menyerahkan solusi spesifik itu kepada OP untuk mencari tahu karena solusi umum yang ditampilkan di sini akan berlaku untuk lebih banyak programmer.
  • Kode dapat dibersihkan dengan menggunakan Tampilan, bukan subkueri.
  • Saya belum mencoba menjalankan kode ini. Mungkin ada kesalahan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana memilih hanya nama bidang saat menggunakan kueri tampilkan kolom di mysql

  2. kesalahan (objek 'datetime.datetime' tidak memiliki atribut 'split') di Django 1.11.4

  3. Hibernate penguncian optimis..bagaimana cara kerjanya?

  4. Cara mengambil catatan kecocokan di beberapa tabel di MySQL

  5. Bagaimana cara memperbarui bidang untuk menambah nilai ke nilai yang ada?