La requête et la formule forment la table entière, avec de nouvelles colonnes, où les nouvelles colonnes sont des formules impliquant d'autres valeurs de colonnes conditionnelles.
P粉178894235
P粉178894235 2024-04-06 21:23:40
0
2
899

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

répondre à tous(2)
P粉302160436

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

dbviolon ici 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 |
+----------+---------+-------+----------------+

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 |
+----------+---------+-------+----------------+
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal