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.