sql >> Base de Datos >  >> RDS >> Mysql

¿Mysql tiene el equivalente de las funciones analíticas de Oracle?

solo quería decirle que puede usar variables en MySQL para imitar funciones analíticas. SUM OVER, por ejemplo, podría hacerse de la siguiente manera:


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

Si desea PARTITION BY , es posible pero un poco más complicado. Básicamente, agrega otro @variable para ver la cuenta (o lo que sea por lo que quiera particionar), ordenar por cuenta (o su variable) y luego restablecer el @sum cuando la cuenta cambia. De la siguiente manera:


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

Notará dos cambios importantes que se tuvieron que hacer para lograr el efecto de partición:

  1. La tabla principal (tbl ) está encerrado en una subselección con un ORDER BY cláusula. Esto es necesario porque cuando MySQL va a hacer @account prueba de variables, los valores ya deben estar ordenados. Si esto no sucediera, obtendría valores de suma incorrectos, así como valores de cuenta.

  2. Hay una columna 'extra' con alias as _ . Puede ignorar esta columna cuando use resultados, pero el orden de @account verificar y cambiar debe estar después de @sum comprobar y cambiar.

    También con esto, puede elegir reordenar sus columnas si no le importa que la cuenta sea la última. Esto se hace sacando la primera account columna ya que se duplica con el último _ columna y luego, obviamente, cambió el nombre del alias _ a account .

Recursos: