Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O mysql tem o equivalente das funções analíticas do Oracle?


só queria dizer que você pode usar variáveis ​​no MySQL para imitar funções analíticas. SUM OVER, por exemplo, pode ser feito da seguinte forma:

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


Se você deseja PARTITION BY , é possível, mas um pouco mais complicado. Basicamente, você adiciona outro @variable para assistir a conta (ou o que você deseja particionar), ordene por conta (ou sua variável) e, em seguida, redefina o @sum quando a conta muda. Do seguinte modo:

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


Você notará duas grandes mudanças que tiveram que ser feitas para realizar o efeito de partição:

  1. A tabela principal (tbl ) está envolto em um sub select com um ORDER BY cláusula. Isso é necessário porque quando o MySQL vai fazer o @account variável testando os valores precisam já estar ordenados. Se isso não acontecesse, você obteria valores de soma incorretos, bem como valores de conta.

  2. Existe uma coluna 'extra' com o alias as _ . Você pode ignorar esta coluna ao usar resultados, mas a ordem do @account check and change precisa estar após o @sum verifique e altere.

    Além disso, você pode optar por reordenar suas colunas se não se importar que a conta seja a última. Isso é feito retirando a primeira account coluna, pois duplica com o último _ coluna e, em seguida, obviamente renomeou o alias _ para account .

Recursos: