Maison > Questions et réponses > le corps du texte
EDIT : La formule doit être la colonne "valeur" - la colonne "valeur" avec l'ID utilisateur le plus bas en fonction de la catégorie.
Donc la ligne 2 sera de 0,04 car la colonne "valeur" du "user_id" le plus bas pour la catégorie "A" est de 0,01.
Désolé.
Je souhaite tout récupérer du tableau et ajouter une autre colonne qui implique des formules contenant des informations basées sur d'autres colonnes. Voici le formulaire original :
Catégorie | identifiant_utilisateur | Valeur |
---|---|---|
un | 1 | 0,01 |
un | 2 | 0,05 |
B | 4 | 0,34 |
B | 7 | 0,27 |
La nouvelle colonne doit être la valeur minimale "user_id" de la colonne "valeur" de chaque ligne moins la "catégorie" . Ainsi, pour la deuxième ligne, ce sera (0,05 - 1) puisque la catégorie est "A" et que le "user_id" le plus bas de "A" est 1.
Il y a beaucoup plus de lignes et de colonnes, ce n'est qu'un exemple.
Quelle formule utiliser ?
Voici ce que j'ai jusqu'à présent, histoire de pouvoir démontrer que je suis capable de créer de nouvelles colonnes, mais sans la bonne formule :
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;
Cela me donne évidemment la nouvelle colonne, mais à 0 (car elle se soustrait).
Quelle est la bonne formule ?
Voici l'architecture :
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
Dans MySQL 5.7, vous pouvez utiliser une sous-requête pour atteindre l'objectif, la vue semble meilleure que la nouvelle table, mais comme la sélection est égale, vous pouvez choisir
db<>violon ici 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 | +----------+---------+-------+----------------+
Cela utilise des fonctions de fenêtre, ce qui signifie qu'il nécessite MySQL 8.0, qui est la version actuelle de MySQL en 2018.
Répondez à votre commentaire : utilisez la colonne value
à partir du user_id le plus bas de la catégorie :
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 | +----------+---------+-------+----------------+