Ö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