sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur Width_Bucket() fungerar i PostgreSQL

I PostgreSQL, width_bucket() är en matematisk funktion som tilldelar värden till hinkar (individuella segment) i ett ekvibreddshistogram.

Returtypen är int .

Syntax

Funktionen kan användas med någon av följande tre syntaxer:

width_bucket(operand dp, b1 dp, b2 dp, count int)
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
width_bucket(operand anyelement, thresholds anyarray)

De två första är i princip likadana, förutom att de använder olika datatyper (dubbel precision vs numerisk).

Dessa tre syntaxer förklaras nedan.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Returnerar bucket-numret som operanden skulle tilldelas i ett histogram med antal lika breda hinkar som spänner över intervallet b1 till b2; returnerar 0 eller count+1 för en ingång utanför intervallet.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Returnerar bucket-numret som operanden skulle tilldelas i ett histogram med antal lika breda hinkar som spänner över intervallet b1 till b2; returnerar 0 eller count+1 för en ingång utanför intervallet.
width_bucket(operand anyelement, thresholds anyarray)
Returnerar hinknumret som operanden skulle tilldelas med en array som listar de nedre gränserna för hinkarna; returnerar 0 för en indata som är mindre än den första nedre gränsen; tröskelvärdesmatrisen måste sorteras, minsta först, annars kommer oväntade resultat att erhållas.

Exempel – Första/Andra syntax

Som nämnts är de två första syntaxerna i princip desamma, förutom att de beskriver de olika datatyperna (dubbel precision vs numerisk).

Här är ett exempel för att visa hur de två första syntaxerna fungerar.

SELECT 
  width_bucket(3, 1, 12, 3),
  width_bucket(5, 1, 12, 3),
  width_bucket(9, 1, 12, 3);

Resultat:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Här är en förklaring. Låt oss undersöka varje argument, börja från det sista och arbeta baklänges till det första.

  • Fjärde argumentet :Jag anger tre hinkar. Jag gör detta genom att använda 3 som det fjärde argumentet.
  • Andra och tredje argument :Jag anger att intervallet är mellan 1 och 12. I det här fallet är mitt andra argument 1 och det tredje argumentet är 12.
  • Första argumentet :Detta värde jämförs med det andra och tredje argumentet för att veta vilken av de tre hinkarna det ska tilldelas. I mitt exempel anropar jag width_bucket() tre gånger för att illustrera konceptet bättre. Jag gör detta så att jag kan ange tre olika värden som det första argumentet, som vart och ett är tilldelat en annan hink.

Följande tabell ger ett annat sätt att visualisera detta:

Värden Hink
1, 2, 3, 4 Hink 1
5, 6, 7, 8 Hink 2
9, 10, 11, 12 Hink 3

Så vi kan se att den första hinken accepterar värden mellan 1 och 4, den andra hinken mellan 5 och 8, och den tredje hinken är för värden mellan 9 och 12.

Om jag skulle ändra det så att det fanns fyra hinkar, kan min kod se ut ungefär så här:

SELECT 
  width_bucket(3, 1, 12, 4),
  width_bucket(5, 1, 12, 4),
  width_bucket(9, 1, 12, 4);

Och tabellen skulle se ut så här:

Värden Hink
1, 2, 3 Hink 1
4, 5, 6 Hink 2
7, 8, 9 Hink 3
10, 11, 12 Hink 4

Utanför räckvidd

Om inmatningen ligger utanför intervallet för hinken får du antingen 0 eller count +1, beroende på om ingången är under intervallet eller över det.

Exempel:

SELECT 
  width_bucket(-3, 1, 12, 3),
  width_bucket(20, 1, 12, 3);

Resultat:

 width_bucket | width_bucket
--------------+--------------
            0 |            4

Exempel – tredje syntax

För att demonstrera den tredje syntaxen, låt oss ta det första exemplet ovan och modifiera det för att använda den tredje syntaxen:

SELECT 
  width_bucket(3, array[1, 4, 8]),
  width_bucket(5, array[1, 4, 8]),
  width_bucket(9, array[1, 4, 8]);

Resultat:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Här skapade jag 3 hinkar och tilldelade explicita värden till var och en. I det här fallet är de alla lika breda hinkar, men det är inget krav.

En stor fördel med den tredje syntaxen är att den låter dig skapa hinkar med ojämn bredd.

Till exempel skulle jag kunna ändra det föregående exemplet till detta:

SELECT 
  width_bucket(3, array[1, 3, 12]),
  width_bucket(5, array[1, 3, 12]),
  width_bucket(9, array[1, 3, 12]);

Resultat:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            2 |            2 |            2

Genom att göra detta ändras de hinkar som varje nummer är tilldelat. Nu hör alla dessa siffror i den andra hinken.

Den tredje syntaxen kan vara användbar för en mängd olika användningsfall. Du kan till exempel ha en rad åldersgrupper som inte är jämnt fördelade.

SELECT 
  width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
  width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
  width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";

Resultat:

 Age Group (15) | Age Group (45) | Age Group (50)
----------------+----------------+----------------
              1 |              3 |              4

Utanför räckvidd

Funktionen returnerar 0 om indata är mindre än den första nedre gränsen.

Exempel:

SELECT width_bucket(8, array[10, 40, 30]);

Resultat:

0

Width_Bucket() kontra CASE

Exemplen på den här sidan kan också göras med en CASE påstående. Skillnaden är att width_bucket() gör det på ett mer kortfattat sätt.

Så här kunde vi skriva om det tidigare exemplet med en CASE uttalande.

SELECT
  CASE
    WHEN 8 BETWEEN  0 AND 9 THEN 0
    WHEN 8 BETWEEN 10 AND 39 THEN 1
    WHEN 8 BETWEEN 40 AND 49 THEN 2
    ELSE 3
  END;

Resultat:

0

Tänk på att indata i alla dessa exempel normalt skulle vara ett variabel- eller kolumnnamn snarare än en konstant.


  1. Vill du lägga till ID för automatisk ökning i befintlig tabell?

  2. postgres:uppgradera en användare till en superanvändare?

  3. Hitta samtidiga händelser i en databas mellan tider

  4. MySQL DROP VIEW