MySQL ha l’equivalente delle “funzioni analitiche” di Oracle?

Sto cercando funzioni analitiche come PARTITION BY in MySQL (vedi i documenti per maggiori informazioni)

Le funzioni analitiche calcolano un valore aggregato in base a un gruppo di righe. Differiscono dalle funzioni aggregate in quanto restituiscono più righe per ciascun gruppo.

Esiste?

NO, è una delle principali carenze di MySQL, rispetto ad altri DBMS come MSSQL, Oracle, PostgreSQL. Dubito fortemente di vedere Window Functions in MySQL in qualsiasi futuro, specialmente dopo l’acquisizione Oracle di MySQL …

Aggiornamento 04/2018

MySQL 8.0 offre funzioni per windows SQL.

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

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

Se vuoi PARTITION BY , è ansible ma solo un po ‘più complicato. Fondamentalmente, aggiungi un’altra @variable per vedere l’account (o qualsiasi altra cosa tu voglia partizionare), ordinare per account (o la tua variabile), e quindi resettare @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
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 è necessario apportare per ottenere l’effetto della partizione:

  1. La tabella principale ( tbl ) è racchiusa in una sub-selezione con una clausola ORDER BY . Questo è necessario perché quando MySQL va a fare la @account variabile @account , i valori devono essere già ordinati. Se ciò non si verifica, ottieni valori di sum errati e valori dell’account.

  2. C’è una colonna ‘extra’ alias as _ . È ansible ignorare questa colonna quando si utilizzano i risultati, ma l’ordine del controllo e della modifica di @account deve essere effettuato dopo il controllo e la modifica di @sum .

    Inoltre con questo, puoi scegliere di riordinare le tue colonne se non ti dispiace che l’account sia l’ultimo. Questo viene fatto estraendo la prima colonna account poiché si duplica con l’ultima _ colonna e quindi ovviamente rinominata l’alias _ per l’ account .

risorse:

Sebbene MySQL non supporti le funzioni analitiche, MariaDB lo fa. È un rimpiazzo per MySQL e viene creato dagli sviluppatori originali di MySQL.

Esiste un prodotto commerciale per SQL Server che fornisce funzioni di analisi in-database e può essere collegato a un oracle o database MySQL tramite ‘server collegati’ / odbc – ecco un articolo che lo descrive: http://westclintech.com/Blog /tabid/132/EntryId/88/Using-XLeratorDB-with-MySQL-and-other-RDBMS-s.aspx

Ciò richiede l’utilizzo di Windows o / se SQL Server 2005 o successivo (che la versione Express è gratuita)