sql >> Databasteknik >  >> RDS >> Mysql

Har mysql motsvarigheten till Oracles analytiska funktioner?

ville bara berätta att du kan använda variabler i MySQL för att efterlikna analytiska funktioner. SUM OVER, till exempel, kan göras på följande sätt:


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

Om du vill PARTITION BY , det är möjligt men bara lite mer komplicerat. I grund och botten lägger du till en annan @variable för att titta på kontot (eller vad du vill partitionera efter), beställ efter konto (eller din variabel) och återställ sedan @sum när kontot ändras. Så här:


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

Du kommer att notera två stora förändringar som måste göras för att uppnå partitionseffekten:

  1. Huvudtabellen (tbl ) är inkapslad i ett underval med en ORDER BY klausul. Detta är nödvändigt eftersom när MySQL går till @account variabeltestning måste värdena redan vara beställda. Om detta inte hände skulle du få felaktiga summavärden såväl som kontovärden.

  2. Det finns en "extra" kolumn med alias as _ . Du kan ignorera den här kolumnen när du använder resultat, men ordningen på @account kontroll och ändring måste ske efter @sum kontrollera och ändra.

    Också med detta kan du välja att ändra ordningen på dina kolumner om du inte hade något emot kontot som sist. Detta görs genom att ta ut det första account kolumnen eftersom den dupliceras med den sista _ kolumnen och döpte sedan uppenbarligen om den aliasade _ till account .

Resurser:



  1. Hur får du din databas att tala många språk?

  2. Allt du behöver veta om LIKE Operator i SQL

  3. Hur man återställer databasen med RMAN

  4. Mekanismer för att spåra DB-schemaändringar