Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ha l'equivalente delle funzioni analitiche di Oracle?

volevo solo dirti che puoi usare le variabili in MySQL per imitare le funzioni analitiche. SUM OVER, ad esempio, potrebbe essere fatto come segue:


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

Se vuoi PARTITION BY , è possibile ma solo un po' più complicato. Fondamentalmente, aggiungi un altro @variable per guardare l'account (o qualunque cosa tu voglia partizionare), ordinare per account (o la tua variabile), e quindi reimpostare il @sum quando l'account cambia. Come segue:


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

Noterai due importanti modifiche che è stato necessario apportare per ottenere l'effetto di partizione:

  1. La tabella principale (tbl ) è racchiuso in un sub select con un ORDER BY clausola. Questo è necessario perché quando MySQL va a fare il @account test delle variabili i valori devono essere già ordinati. Se ciò non accadesse, otterresti valori di somma errati e valori dell'account.

  2. C'è una colonna "extra" alias as _ . Puoi ignorare questa colonna quando utilizzi i risultati, ma l'ordine del @account il controllo e la modifica devono essere dopo il @sum controlla e cambia.

    Inoltre, con questo, potresti scegliere di riordinare le tue colonne se non ti dispiaceva essere l'ultimo. Questo viene fatto eliminando il primo account colonna poiché si duplica con l'ultimo _ colonna e poi ovviamente rinominato l'alias _ a account .

Risorse: