Diberikan data berikut:
id | user_id | started | closed | dead
-------------------------------------------------------------------------------------------
7714 | 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 | NULL
7882 | 238846 | 2015-01-28 13:25:58 | NULL | 2015-05-15 12:16:07
13190 | 259140 | 2015-03-17 10:11:44 | NULL | 2015-03-18 07:31:57
13192 | 259140 | 2015-03-17 10:12:17 | NULL | 2015-03-18 11:46:46
13194 | 259140 | 2015-03-17 10:12:53 | NULL | 2015-03-18 11:46:36
14020 | 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 | NULL
17124 | 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 | NULL
19690 | 238846 | 2015-05-15 13:17:31 | NULL | 2015-05-27 13:56:43
20038 | 242650 | 2015-05-19 15:38:17 | NULL | NULL
20040 | 242650 | 2015-05-19 15:39:58 | NULL | 2015-05-21 12:01:02
20302 | 242650 | 2015-05-21 13:09:06 | NULL | NULL
20304 | 242650 | 2015-05-21 13:09:54 | NULL | NULL
20306 | 242650 | 2015-05-21 13:10:19 | NULL | NULL
20308 | 242650 | 2015-05-21 13:12:20 | NULL | NULL
21202 | 238846 | 2015-05-29 16:47:29 | NULL | NULL
21204 | 238846 | 2015-05-29 16:47:56 | NULL | NULL
21208 | 238846 | 2015-05-29 17:05:15 | NULL | NULL
21210 | 238846 | 2015-05-29 17:05:55 | NULL | NULL
21918 | 242650 | 2015-06-04 17:04:29 | NULL | 2015-06-12 15:47:23
Saya perlu membuat kumpulan data yang memenuhi aturan berikut:
- Grup didefinisikan terlebih dahulu oleh
user_id
karena itu kita hanya harus membandingkan catatan dari yang samauser_id
- Semua catatan yang dimulai setidaknya dalam 15 hari ketika catatan lainnya dimulai, ditutup atau mati harus dihitung sebagai grup.
- Dari masing-masing kelompok, akhir harus dihitung sebagai catatan pertama ditutup atau semua catatan memiliki nilai untuk mati dan kami mengambil tanggal terbesar dari kolom mati.
- Jika catatan tidak dimulai dalam 15 hari sejak awal atau akhir grup lain, maka itu memulai pengelompokan baru.
Untuk sementara, saya yakin data saya akan terlihat seperti ini:
user_id | mulai | akhir -------------------------------------------------- ---- 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 242650 | 2015-05-21 13:09:06 | BATAL 238846 | 2015-05-15 13:17:31 | BATAL
Adakah yang bisa memberikan panduan tentang cara membuat kueri untuk memenuhi persyaratan ini?
Berikut ini tautan ke pernyataan DDL dan DML untuk data yang disajikan dalam pertanyaan ini.
Atau, kita dapat melewati aturan # 2 dan # 4 dan lebih sederhana menyatakan bahwa hanya catatan yang saling tumpang tindih yang harus dimasukkan. Aturan yang lebih penting adalah bahwa dalam set yang diberikan, jika ada tanggal yang ditutup maka itu menjadi akhir set dan bukan tanggal mati terbesar.
Jawaban:
Karena kurangnya kejelasan dalam pertanyaan, saya menemukan empat solusi berbeda. Solusinya berbeda pada:
Harap dicatat ini dilakukan dalam SQL Server, bukan MySQL. Selain beberapa perubahan sintaks yang sangat kecil, itu harus bekerja sama.
Pengaturan umum dan data sampel untuk keempat metode
1. CASCADING - MENGGUNAKAN solusi RECORD TERTUTUP
Ini adalah solusi yang saya yakin penanya sedang mencari & mencocokkan hasilnya.
2. NON-CASCADING - MENGGUNAKAN solusi RECORD TERTUTUP
Mulai dihitung dengan tanggal tutup pertama saat tersedia, kemudian pada tanggal awal paling awal.
3. NON-CASCADING - MENGGUNAKAN solusi DATE AWAL
Mulai dihitung berdasarkan tanggal paling awal saja.
4. CASCADING - MENGGUNAKAN solusi DATE AWAL
Mulai dihitung berdasarkan tanggal paling awal saja.
sumber
Saya khawatir bahwa kita mungkin tidak memiliki gambaran yang jelas tentang bagaimana suatu kelompok didefinisikan. Saya hanya mengatakan ini karena, tergantung pada beberapa kondisi yang tidak disebutkan, tanggal di atas akan membentuk satu kelompok tunggal raksasa, atau 3 kelompok di mana satu kelompok mendominasi set.
Kondisi pengelompokan yang hilang?
1) Apakah aturan 15 hari ini menurun? Jika catatan
Y
dimulai 10 hari setelah catatan lainX
, dan kemudian ada catatan lainZ
dimulai 10 hari setelah itu, maka apakah ini membentuk satu kelompok yang terdiri dari tiga catatanX,Y,Z
, atau dua kelompok yang masing-masing berisi dua catatanX,Y
danY,Z
? Saya membuat asumsi bahwa aturan 15 hari itu mengalir membentuk kelompok yang lebih besar.2) Apakah tanggal termasuk? Misalnya, jika satu catatan memiliki tanggal mulai dan kemudian tanggal mati berbulan-bulan kemudian, apakah semua hari dalam rentang itu digabungkan ke dalam grup? Saya memperlakukan kedua kemungkinan dalam analisis singkat saya di bawah ini.
Pengelompokan potensial
Jadi, jika kita mulai dengan id
7714
, kita melihat bahwa tanggal mulai adalah 1/27. Jelas, entri berikutnya7882
mulai 1/28 jatuh di grup ini. Namun perhatikan bahwa7882
berakhir pada 5/15, jadi apa pun yang dimulai dalam 15 hari dari 5/15 harus ditambahkan ke grup.Dengan demikian,
19690
melalui21210
ditambahkan ke grup, yang melalui cascading mengarah ke21918
selanjutnya ditambahkan ke grup. Cascading telah menghabiskan hampir semua entri di set. Sebut iniGROUP A
.Namun, jika pengelompokan itu termasuk tanggal juga, semua entri dari
13190
hingga17124
juga harus menjadi milikGROUP A
, dan sekarang semua id dalam satu grup.Jika tanggal dari
GROUP A
tidak inklusif, tetapi sebenarnya secara ketat mematuhi '15 hari setelah' aturan dengan Cascading, maka sebagai gantinya Anda akan memiliki kelompok kedua terdiri dari13190
melalui14020
, dan kelompok ketiga dengan single entry,17124
.Pada dasarnya, pertanyaan saya adalah, apakah ada yang cocok dengan pengelompokan yang Anda maksudkan, atau adakah informasi lain yang tidak ada dalam definisi grup? Saya minta maaf atas jawaban yang bertele-tele, tetapi sepertinya output tentatif yang Anda minta tidak memenuhi definisi pengelompokan Anda.
Dengan klarifikasi, saya yakin kita bisa menyelesaikan masalah ini.
sumber