Pertanyaan dan formula membentuk keseluruhan jadual, dengan lajur baharu, dengan lajur baharu ialah formula yang melibatkan nilai lajur bersyarat lain
P粉178894235
P粉178894235 2024-04-06 21:23:40
0
2
889

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粉178894235
P粉178894235

membalas semua(2)
P粉302160436

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

dbfiddle sini p>

P粉627027031
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 |
+----------+---------+-------+----------------+
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan