sql >> Database >  >> RDS >> Mysql

Heeft mysql het equivalent van de analytische functies van Oracle?

Ik wilde je alleen vertellen dat je variabelen in MySQL kunt gebruiken om analytische functies na te bootsen. SUM OVER kan bijvoorbeeld als volgt worden gedaan:


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

Als u wilt PARTITION BY , het is mogelijk, maar net iets ingewikkelder. Kortom, je voegt nog een @variable toe om het account te bekijken (of waar u ook op wilt partitioneren), sorteer op account (of uw variabele) en reset vervolgens de @sum wanneer de rekening verandert. Als volgt:


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

Je zult twee belangrijke veranderingen opmerken die gedaan moesten worden om het partitie-effect te bereiken:

  1. De hoofdtabel (tbl ) is ingekapseld in een subselectie met een ORDER BY clausule. Dit is nodig omdat wanneer MySQL het @account . gaat doen variabele testen de waarden moeten al besteld zijn. Als dit niet is gebeurd, krijgt u onjuiste somwaarden en accountwaarden.

  2. Er is een 'extra' kolom met de alias as _ . U kunt deze kolom negeren bij het gebruik van resultaten, maar de volgorde van het @account controleren en wijzigen moet na de @sum . zijn controleren en wijzigen.

    Ook hiermee kunt u ervoor kiezen om uw kolommen opnieuw te ordenen als u het niet erg vindt dat uw account de laatste is. Dit doe je door het eerste account . af te sluiten kolom omdat deze dupliceert met de laatste _ kolom en vervolgens hernoemd uiteraard de alias _ naar account .

Bronnen:



  1. SQLite FULL OUTER JOIN-emulatie

  2. Hoe SUBSTRING_INDEX() werkt in MariaDB

  3. Moet ik een rij in een relationele database verwijderen of uitschakelen?

  4. Optimalisatiedrempels - Gegevens groeperen en aggregeren, deel 2