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 :
-
La table principale (
tbl
) est enfermé dans une sous-sélection avec unORDER 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. -
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_
auaccount
.
Ressources :
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175