sql >> Databasteknik >  >> RDS >> Oracle

Produkt() aggregatfunktion

Logarathm/power-metoden är den allmänt använda metoden. För Oracle, det vill säga:

select exp(sum(ln(col)))
from table;

Jag vet inte varför de ursprungliga databasdesignerna inte inkluderade PRODUCT() som en aggregeringsfunktion. Min bästa gissning är att de alla var datavetare, utan statistiker. Sådana funktioner är mycket användbara i statistik, men de dyker inte upp mycket inom datavetenskap. De kanske inte ville ta itu med spillproblem, som en sådan funktion skulle innebära (särskilt på heltal).

Förresten, den här funktionen saknas i de flesta databaser, även de som implementerar många statistiska aggregeringsfunktioner.

redigera:

Oj, problemet med negativa siffror gör det lite mer komplicerat:

select ((case when mod(sum(sign(col)), 2) = 0 then 1 else -1 end) *
        exp(sum(ln(abs(col))))
       ) as product

Jag är inte säker på ett säkert sätt i Oracle att hantera 0 s. Detta är ett "logiskt" tillvägagångssätt:

select (case when sum(case when col = 0 then 1 else 0 end) > 0
             then NULL
             when mod(sum(sign(col)), 2) = 0
             then exp(sum(ln(abs(col)))
             else - exp(sum(ln(abs(col)))
        end) 
       ) as product

Problemet är att databasmotorn kan få ett fel i loggen innan case körs påstående. Det råkar vara så SQL Server fungerar. Jag är inte säker på Oracle.

Ah, det här kanske fungerar:

select (case when sum(case when col = 0 then 1 else 0 end) > 0
             then NULL
             when mod(sum(sign(col)), 2) = 0
             then exp(sum(ln(case when col <> 0 then abs(col) end)))
             else - exp(sum(ln(case when col <> 0 then abs(col) end)))
        end) 
       ) as product

Den returnerar NULL när det finns en 0 .



  1. Dimensions of Dimensions:En titt på Data Warehousings vanligaste dimensionstabelltyper

  2. Uppladdning av CSV-fil för att hantera statusuppdatering och infoga nya poster

  3. Använder r sf::st_write till icke-offentligt schema i PostgreSQL

  4. Wordpress Sök i seriell metadata med anpassad fråga