編輯:公式應該是「值」欄位 - 根據類別具有最低 user_id 的「值」欄位。
因此第 2 行將為 0.04,因為類別「A」的最低「user_id」的「value」欄位是 0.01。
抱歉。
我想從表中檢索所有內容,並添加另一列,其中涉及包含基於其他列的資訊的公式。這是原始表格:
類別 | user_id | 值 |
---|---|---|
一個 | 1 | 0.01 |
一個 | 2 | 0.05 |
B | 4 | 0.34 |
B | 7 | 0.27 |
新欄位必須是每行的「值」欄位減去「類別」的最小值「user_id」。因此,對於第二行,它將是 (0.05 - 1),因為類別是“A”,而“A”的最低“user_id”是 1。
還有更多的行和列,這只是一個範例。
我會用什麼公式?
這是我到目前為止所擁有的,只是為了能夠證明我能夠創建新列,但沒有正確的公式:
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;
這顯然給了我新的列,但為 0(因為它減去了自身)。
正確的公式是什麼?
這是架構:
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
在 mysql 5.7 中,您可以使用子查詢來達到目的,視圖似乎比新表更好,但由於選擇是相等的,您可以選擇
db<>小提琴此處 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 | +----------+---------+-------+----------------+
這使用了視窗函數,表示它需要 MySQL 8.0,這是自 2018 年以來 MySQL 的當前版本。
回覆您的評論:使用類別中最低 user_id 中的 value
欄位:
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 | +----------+---------+-------+----------------+