PostgreSQL GROUPING SETS

author
3 minutes, 54 seconds Read

Összefoglaló: Ebben a bemutatóban megismerkedhet a csoportosító halmazok fogalmával és azzal, hogyan használhatja a PostgreSQL GROUPING SETS záradékát több csoportosító halmaz létrehozására egy lekérdezésben.

Mintatábla beállítása

Kezdjük el egy új,sales nevű tábla létrehozásával a bemutatóhoz.

Code language: SQL (Structured Query Language) (sql)

A sales tábla az eladott termékek számát tárolja márka és szegmens szerint.

Bevezetés a PostgreSQL-hez CSOPORTKÉSZLETEK

A csoportosító készlet olyan oszlopok halmaza, amelyek alapján a GROUP BY záradék használatával csoportosíthat.

A csoportosító készletet az oszlopok zárójelek közé tett, vesszővel elválasztott listája jelöli:

A következő lekérdezés például a GROUP BY záradékot használja az eladott termékek számának márka és szegmens szerinti megadására. Más szóval, meghatározza a márka és a szegmens csoportosító halmazát, amelyet a (brand, segement)

Code language: SQL (Structured Query Language) (sql)

A következő lekérdezés egy márka által eladott termékek számát találja meg. Meghatározza a (brand):

Code language: SQL (Structured Query Language) (sql)

A következő lekérdezés a szegmensenként értékesített termékek számát találja meg. Meghatározza a (segment):

Code language: SQL (Structured Query Language) (sql)

A következő lekérdezés az összes márka és szegmens esetében megtalálja az eladott termékek számát. Egy üres csoportosítási halmazt definiál, amelyet a következővel jelöl: ().

Code language: SQL (Structured Query Language) (sql)

Tegyük fel, hogy egyetlen lekérdezéssel az összes csoportosítási halmazt meg akarja keresni. Ennek eléréséhez a UNION ALL segítségével kombinálhatja a fenti lekérdezéseket.

Mert mivel a UNION ALL megköveteli, hogy minden eredményhalmaznak ugyanannyi kompatibilis adattípusú oszloppal kell rendelkeznie, a lekérdezéseket úgy kell beállítania, hogy mindegyik kiválasztási listájához hozzáadja a NULL-t az alábbiak szerint:

Code language: SQL (Structured Query Language) (sql)

Ez a lekérdezés egyetlen eredményhalmazt generál az összes csoportosítási halmaz aggregátumával.

Noha a fenti lekérdezés az elvárásoknak megfelelően működik, két fő problémája van:

  • Először is, meglehetősen hosszadalmas.
  • Másodszor, teljesítményproblémát okoz, mivel a PostgreSQL-nek minden egyes lekérdezésnél külön kell átvizsgálnia a sales táblát.

A hatékonyság növelése érdekében a PostgreSQL biztosítja a GROUPING SETS klauzulát, amely a GROUP BY klauzula alkluzulája.

A GROUPING SETS lehetővé teszi több csoportosítási halmaz definiálását ugyanabban a lekérdezésben.

A GROUPING SETS általános szintaxisa a következő:

Code language: SQL (Structured Query Language) (sql)

Ebben a szintaxisban négy csoportosítási halmazunk van: (c1,c2), (c1), (c2) és ().

Ezt a szintaxist a fenti példára alkalmazva a UNION ALL záradék helyett a GROUPING SETS záradékot használhatjuk a következőképpen:

Code language: SQL (Structured Query Language) (sql)

Ez a lekérdezés sokkal rövidebb és olvashatóbb. Ezenkívül a PostgreSQL optimalizálja a sales tábla átvizsgálásának számát, és nem vizsgálja át többször.

Grouping function

A GROUPING() függvény egy argumentumot fogad el, amely lehet egy oszlopnév vagy egy kifejezés:

A column_name vagy expression kifejezésnek meg kell egyeznie a GROUP BY záradékban megadottal.

A GROUPING() függvény 0 bitet ad vissza, ha az argumentum az aktuális csoportosítási halmaz tagja, ellenkező esetben 1-et.

Lássuk a következő példát:

Code language: SQL (Structured Query Language) (sql)

A képernyőképen látható, hogy ha a grouping_brand-ben lévő érték 0, a sum oszlop a brand részösszegét mutatja.

Ha a grouping_segment-ban lévő érték nulla, az összeg oszlop a segment részösszegét mutatja.

A HAVING záradékban lévő GROUPING() függvénnyel így találhatja meg az egyes márkák részösszegét:

Ezzel a bemutatóval megtanulta, hogyan használhatja a PostgreSQL GROUPING SETS-t több csoportosítási halmaz létrehozására.

  • Az oktatóanyag hasznos volt?
  • IgenNem

Similar Posts

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.