sql >> Database >  >> RDS >> PostgreSQL

Hoe Width_Bucket() werkt in PostgreSQL

In PostgreSQL, width_bucket() is een wiskundige functie die waarden toewijst aan buckets (individuele segmenten) in een histogram van gelijke breedte.

Het retourtype is int .

Syntaxis

De functie kan worden gebruikt met een van de drie volgende syntaxis:

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 eerste twee zijn in principe hetzelfde, behalve dat ze verschillende gegevenstypen gebruiken (dubbele precisie versus numeriek).

Deze drie syntaxis worden hieronder uitgelegd.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Retourneert het bucketnummer waaraan de operand zou worden toegewezen in een histogram met een aantal buckets van gelijke breedte die het bereik b1 tot b2 overspannen; geeft 0 of count+1 terug voor een invoer buiten het bereik.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Retourneert het bucketnummer waaraan de operand zou worden toegewezen in een histogram met een aantal buckets van gelijke breedte die het bereik b1 tot b2 overspannen; geeft 0 of count+1 terug voor een invoer buiten het bereik.
width_bucket(operand anyelement, thresholds anyarray)
Retourneert het bucketnummer waaraan de operand zou worden toegewezen gegeven een array met de ondergrenzen van de buckets; geeft 0 terug voor een invoer die kleiner is dan de eerste ondergrens; de array met drempels moet worden gesorteerd, de kleinste eerst, anders worden onverwachte resultaten verkregen.

Voorbeeld – Eerste/tweede syntaxis

Zoals vermeld, zijn de eerste twee syntaxis in principe hetzelfde, behalve dat ze de verschillende gegevenstypen schetsen (dubbele precisie versus numeriek).

Hier is een voorbeeld om te demonstreren hoe de eerste twee syntaxis werken.

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

Resultaat:

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

Hier is een uitleg. Laten we elk argument eens bekijken, beginnend bij het laatste en terugwerkend naar het eerste.

  • Vierde argument :Ik specificeer drie emmers. Ik doe dit door 3 als vierde argument te gebruiken.
  • Tweede en derde argument :Ik specificeer dat het bereik tussen 1 en 12 ligt. In dit geval is mijn tweede argument 1 en is het derde argument 12.
  • Eerste argument :Deze waarde wordt vergeleken met het tweede en derde argument, om te weten aan welke van de drie buckets het moet worden toegewezen. In mijn voorbeeld noem ik width_bucket() drie keer om het concept beter te illustreren. Ik doe dit zodat ik drie verschillende waarden als eerste argument kan opgeven, die elk aan een andere bucket worden toegewezen.

De volgende tabel biedt een andere manier om dit te visualiseren:

Waarden Emmer
1, 2, 3, 4 Emmer 1
5, 6, 7, 8 Emmer 2
9, 10, 11, 12 Emmer 3

We kunnen dus zien dat de eerste bucket waarden tussen 1 en 4 accepteert, de tweede bucket tussen 5 en 8, en de derde bucket is voor waarden tussen 9 en 12.

Als ik het zou veranderen zodat er vier buckets zijn, zou mijn code er ongeveer zo uit kunnen zien:

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

En de tabel zou er als volgt uitzien:

Waarden Emmer
1, 2, 3 Emmer 1
4, 5, 6 Emmer 2
7, 8, 9 Emmer 3
10, 11, 12 Emmer 4

Buiten bereik

Als de invoer buiten het bereik van de bucket valt, krijgt u 0 of count +1, afhankelijk van of de invoer onder of boven het bereik ligt.

Voorbeeld:

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

Resultaat:

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

Voorbeeld – Derde syntaxis

Laten we, om de derde syntaxis te demonstreren, het eerste voorbeeld hierboven nemen en dit aanpassen om de derde syntaxis te gebruiken:

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

Resultaat:

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

Hier heb ik 3 buckets gemaakt en aan elke bucket expliciete waarden toegewezen. In dit geval zijn het allemaal bakken van gelijke breedte, maar dat is geen vereiste.

Een groot voordeel van de derde syntaxis is dat u hiermee buckets van ongelijke breedte kunt maken.

Ik zou bijvoorbeeld het vorige voorbeeld hieraan kunnen aanpassen:

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

Resultaat:

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

Als u dit doet, worden de buckets waaraan elk nummer is toegewezen, gewijzigd. Nu horen al die nummers in de tweede emmer.

De derde syntaxis kan nuttig zijn voor verschillende gebruikssituaties. U kunt bijvoorbeeld verschillende leeftijdsgroepen hebben die niet gelijk verdeeld zijn.

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)";

Resultaat:

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

Buiten bereik

De functie retourneert 0 als de invoer kleiner is dan de eerste ondergrens.

Voorbeeld:

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

Resultaat:

0

Width_Bucket() versus CASE

De voorbeelden op deze pagina kunnen ook worden gedaan met een CASE uitspraak. Het verschil is dat width_bucket() doet het op een meer beknopte manier.

Hier is hoe we het vorige voorbeeld kunnen herschrijven met een CASE verklaring.

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;

Resultaat:

0

Houd er rekening mee dat de invoer in al deze voorbeelden normaal gesproken een variabele of kolomnaam is in plaats van een constante.


  1. Een fout oplossen bij het maken van een groot IMDB-model

  2. Oracle invoegen als rij niet bestaat

  3. Hoe maak je een index op het JSON-veld in Postgres?

  4. Kan PostgreSQL matrixkolommen indexeren?