recherche

Maison  >  Questions et réponses  >  le corps du texte

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.

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粉178894235P粉178894235229 Il y a quelques jours820

répondre à tous(2)je répondrai

  • P粉302160436

    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

    répondre
    0
  • P粉627027031

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

    répondre
    0
  • Annulerrépondre