Saya memiliki tabel yang berisi beberapa kunci ke tabel lain (di mana setiap tombol terdiri dari beberapa kolom). Saya ingin dapat mengelompokkan baris bersama yang memiliki kunci yang sama, tetapi saya tidak ingin mengelompokkan semuanya bersama. Ini tidak sederhana GROUP BY
pada kunci tetapi saya ingin dapat membuat kelompok katakanlah 10. Jadi jika kunci tertentu muncul 50 kali saya akan mendapatkan 5 hasil ketika saya melakukan pengelompokan ini (5 kelompok 10). Saya juga ingin pengelompokan ini terjadi secara acak di dalam kunci.
Saya tidak tahu cara langsung untuk melakukan ini, dan metode bundaran yang saya buat tidak berfungsi seperti yang saya kira seharusnya. Solusi bundaran yang saya buat adalah untuk membuat kolom baru untuk setiap kunci yang akan menjadi bilangan bulat sehingga nilai i
mewakili ith
terjadinya kunci itu (tetapi dalam urutan acak). Saya kemudian bisa melakukan pembagian integer sehingga setiap n (katakanlah 10) baris dalam kunci memiliki nilai yang sama, dan saya bisa melakukan GROUP BY
pada nilai itu.
Apakah ada cara yang lebih langsung untuk mencapai apa yang baru saja saya jelaskan? Cukup aneh, dan saya mengalami masalah dalam membuat kolom indeks baru (seperti yang saya jelaskan dalam pertanyaan ini ).
EDIT: Pertama-tama perhatikan bahwa ini untuk MySQL. Saya akan menambahkan contoh jika tujuan saya tidak jelas. Dokumen MySQL menunjukkan metode untuk sampai di sana :
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Ini menciptakan tabel yang, meskipun bukan yang saya inginkan, semakin dekat:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
Saya pada dasarnya ingin GROUP BY
id, kecuali saya ingin catatan dengan mammal
memiliki satu "grup" untuk ID 1-10, "grup" lain untuk ID 11-20, dll. Namun, saya akan melakukan ini dengan tabel yang ada, dan saya tidak akan selalu ingin "anjing" muncul dengan ID 1. Saya ingin agar pemesanan awal menjadi acak, tetapi kemudian deterministik sejak saat itu.
I would want that initial ordering to be random, but then deterministic from then out.
<- katakan apa? Saya pikir apa pun yang Anda lakukan, Anda harus meletakkan catatan di semacam tabel kedua. Bagaimana tepatnya logika bisnis ini berfungsi? Seperti halnya tidak ada yang mengharuskan (misalnya) anjing untuk didahulukan. Dan apa yang Anda maksud denganI would want the records from *mammal* to have one "group" for IDs 1-10, and another for IDs 11-20
... bisakah Anda menggambarkannya dengan tabel lain, yang berfokus pada mamalia, dalam uraian pertanyaan di atas?numMammal
. Saya tidak terlalu peduli dengan id yang sayadog
dapat, tetapi saya tidak ingin itu tergantung pada urutan penyisipan asli.GROUP BY
. Saya kemudian mungkin ingin memasangkan kelompok 10 untuk menemukan korelasi antara rata-rata. Saya perlu pemesanan acak ini karena jika urutan penyisipan asli disortir berdasarkan berat maka ini akan memberi saya hasil yang salah. Saya harap saya masuk akal.Jawaban:
Bagaimana dengan melakukan sedikit matematika terhadap kolom ID Anda untuk menghasilkan grup secara dinamis?
Ini akan memberi Anda kelompok 10 berdasarkan ID catatan. Saya menggunakan tabel hewan Anda di atas untuk menghasilkan data di bawah ini.
Contoh data
Output Permintaan
sumber
Dalam SQL umumnya ini akan menjadi:
sebuah subselect DISTINCTGABUNG kembali ke tabel utama pada tombol DISTINCTIni bukan agregat sehingga GROUP BY tidak diperlukan
Edit:
Sebenarnya, NTILE sudah cukup dengan sendirinya untuk membuat "n ember per set nilai yang berbeda"
sumber
Saya masih belum melihat solusi lengkap (yang sebenarnya berfungsi di MySQL), jadi ini solusi yang mungkin akan saya gunakan:
Saya masih berharap seseorang dapat mengalahkan jawaban ini; Saya tidak mau harus menerima jawaban saya sendiri. Saya sudah mengatakan ini sebelumnya, tetapi saya tahu dari awal bagaimana melakukan # 2; # 1 adalah yang menggangguku. Jika Anda dapat menjawab # 1 maka Anda benar-benar menjawab pertanyaan lain juga, tetapi mungkin untuk menjawab pertanyaan ini dengan beberapa cara lain untuk memotong # 1.
sumber
sumber