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

Har mysql det, der svarer til Oracles analytiske funktioner?

ville bare fortælle dig, at du kan bruge variabler i MySQL til at efterligne analytiske funktioner. SUM OVER kunne for eksempel gøres på følgende måde:


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

Hvis du ønsker at PARTITION BY , det er muligt, men bare lidt mere kompliceret. Grundlæggende tilføjer du en anden @variable for at se kontoen (eller hvad du nu vil opdele efter), bestil efter konto (eller din variabel), og nulstil derefter @sum når kontoen ændres. Som følger:


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 vil bemærke to store ændringer, der skulle gøres for at opnå partitionseffekten:

  1. Hovedtabellen (tbl ) er indkapslet i et undervalg med en ORDER BY klausul. Dette er nødvendigt, fordi når MySQL går til at gøre @account variabel testning, skal værdierne allerede være bestilt. Hvis dette ikke skete, ville du få forkerte sumværdier såvel som kontoværdier.

  2. Der er en "ekstra" kolonne kaldet as _ . Du kan ignorere denne kolonne, når du bruger resultater, men rækkefølgen af ​​@account check og ændring skal være efter @sum kontrollere og ændre.

    Også med dette kunne du vælge at omarrangere dine kolonner, hvis du ikke havde noget imod, at kontoen var sidst. Dette gøres ved at tage den første account ud kolonne, da den dubleres med den sidste _ kolonne og derefter åbenbart omdøbt aliasset _ til account .

Ressourcer:



  1. Hvad er kardinalitet i MySQL?

  2. Tjek, om RPC Out er aktiveret på en forbundet server

  3. Oprettelse af en PostgreSQL-bruger og tilføjelse af dem til en database

  4. Hvordan angives et portnummer i SQL Server-forbindelsesstrengen?