Rumah > Soal Jawab > teks badan
EDIT: Formula hendaklah lajur "nilai" - lajur "nilai" dengan user_id terendah berdasarkan kategori.
Jadi baris 2 akan menjadi 0.04 kerana lajur "nilai" bagi "id_pengguna" terendah untuk kategori "A" ialah 0.01.
Maaf.
Saya ingin mendapatkan semula semua daripada jadual dan menambah lajur lain yang melibatkan formula yang mengandungi maklumat berdasarkan lajur lain. Berikut adalah bentuk asal:
Kategori | user_id | Nilai |
---|---|---|
satu | 1 | 0.01 |
satu | 2 | 0.05 |
B | 4 | 0.34 |
B | 7 | 0.27 |
Lajur baharu mestilah nilai minimum "id_pengguna" bagi setiap lajur "nilai" baris tolak "kategori" . Jadi untuk baris kedua ia akan menjadi (0.05 - 1) kerana kategorinya ialah "A" dan "user_id" terendah bagi "A" ialah 1.
Ada banyak lagi baris dan lajur, ini hanya contoh.
Apakah formula yang akan saya gunakan?
Inilah yang saya miliki setakat ini, hanya untuk dapat menunjukkan bahawa saya mampu mencipta lajur baharu, tetapi tanpa formula yang betul:
CREATE TABLE new_table AS (select * FROM table_1); ALTER TABLE new_table ADD COLUMN `new_column` DECIMAL(3,2) GENERATED ALWAYS AS (table_1.value-table_1.value) STORED; select * from new_table;
Ini jelas memberi saya lajur baharu, tetapi pada 0 (kerana ia menolak dirinya sendiri).
Apakah formula yang betul?
Ini adalah seni bina:
CREATE TABLE table_1 ( `category` VARCHAR(2), `user_id` INT(2), `value` DECIMAL(3,2) ); INSERT INTO table_1 (`category`, `user_id`, `value`) VALUES ('A', 1, 0.01), ('A', 2, 0.05), ('B', 4, 0.34), ('B', 7, 0.27) ;
P粉3021604362024-04-07 16:15:44
Dalam mysql 5.7 anda boleh menggunakan subquery untuk mencapai matlamat, pandangan kelihatan lebih baik daripada jadual baharu, tetapi memandangkan pilihan adalah sama, anda boleh memilih
db<>fiddle sini p>
P粉6270270312024-04-07 15:41:34
mysql> create view new_table as select category, user_id, value, value - min(user_id) over (partition by category) as adjusted_value from table_1; mysql> select * from new_table; +----------+---------+-------+----------------+ | category | user_id | value | adjusted_value | +----------+---------+-------+----------------+ | A | 1 | 0.01 | -0.99 | | A | 2 | 0.05 | -0.95 | | B | 4 | 0.34 | -3.66 | | B | 7 | 0.27 | -3.73 | +----------+---------+-------+----------------+
Ini menggunakan fungsi tetingkap, bermakna ia memerlukan MySQL 8.0, iaitu versi MySQL semasa pada 2018.
Balas ulasan anda: Gunakan lajur value
dari user_id terendah dalam kategori:
mysql> create or replace view new_table as select category, user_id, value, value - first_value(value) over (partition by category order by user_id) as adjusted_value from table_1; mysql> select * from new_table; +----------+---------+-------+----------------+ | category | user_id | value | adjusted_value | +----------+---------+-------+----------------+ | A | 1 | 0.01 | 0.00 | | A | 2 | 0.05 | 0.04 | | B | 4 | 0.34 | 0.00 | | B | 7 | 0.27 | -0.07 | +----------+---------+-------+----------------+