Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql a-t-il l'équivalent des fonctions analytiques d'Oracle ?

Je voulais juste vous dire que vous pouvez utiliser des variables dans MySQL pour imiter les fonctions analytiques. SUM OVER, par exemple, pourrait être fait comme suit :


SELECT amount, 
    @sum := @sum + amount as sum 
FROM tbl
JOIN (SELECT @sum := 0) s

Si vous voulez PARTITION BY , c'est possible mais juste un peu plus compliqué. En gros, vous ajoutez un autre @variable pour surveiller le compte (ou tout ce que vous voulez partitionner), trier par compte (ou votre variable), puis réinitialiser le @sum lorsque le compte change. Comme suit :


SELECT account, 
    amount, 
    (case when @account != account then @sum := amount else @sum := @sum + amount end) as sum,
    (case when @account != account then @account := account else @account end) as _
FROM (SELECT * FROM tbl ORDER BY account)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a

Vous remarquerez deux modifications majeures qui ont dû être effectuées pour obtenir l'effet de partition :

  1. La table principale (tbl ) est enfermé dans une sous-sélection avec un ORDER BY clause. Ceci est nécessaire car lorsque MySQL va faire le @account test de variable les valeurs doivent déjà être commandées. Si cela ne se produisait pas, vous obtiendriez des valeurs de somme incorrectes ainsi que des valeurs de compte.

  2. Il y a une colonne "supplémentaire" alias as _ . Vous pouvez ignorer cette colonne lors de l'utilisation des résultats, mais l'ordre du @account vérifier et modifier doit être après le @sum vérifier et changer.

    De plus, avec cela, vous pouvez choisir de réorganiser vos colonnes si cela ne vous dérange pas que le compte soit le dernier. Cela se fait en ouvrant le premier account colonne car elle se duplique avec le dernier _ colonne puis renommé évidemment l'alias _ au account .

Ressources :