Einzelnen Beitrag anzeigen

Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
671 Beiträge
 
FreePascal / Lazarus
 
#5

AW: SQL group by jedoch nur 10 records pro Gruppe

  Alt 7. Jan 2024, 08:40
die erweiterung die Firebird da kann sind auf jeden Fall ein Weg, wie man das umsetzen
kann, ist aber nicht immer intuitiv für alte säcke (wie mich) zu verstehen, daher geht das
wenn ich das richtig verstanden hab auch so (beispiel auf basis der ibexpert demodb db1)

Code:
select CATEGORY.TXT,
       (select sum(X_PRICE)
        from (select first 10 X_PRODUCT.PRICE X_PRICE
              from PRODUCT X_PRODUCT
              where X_PRODUCT.CATEGORY_ID = CATEGORY.ID
              order by PRICE desc))
from category
wie komm ich da drauf?

1. im inneren select willst du immer nur die 10 höchsten records haben

Code:
select first 10 X_PRODUCT.PRICE X_PRICE
              from PRODUCT X_PRODUCT
              order by X_PRODUCT.PRICE desc
eine alias benutze ich da schon damit diese eben dann später mit den äußeren selects nix durcheinander kommt

2. du brauchst die gruppierte summe der 10 records also ermittelst du nur die summe zur gruppe, die kommt dann gleich von einem noch drumherum liegenden äußeren select

Code:
select sum(X_PRICE)
from (select first 10 X_PRODUCT.PRICE X_PRICE
              from PRODUCT X_PRODUCT
              where X_PRODUCT.CATEGORY_ID = CATEGORY.ID
              order by PRICE desc))
3. und das jeweils zeilenweise als spaltenwert ermitteln für jede gruppe

Code:
select CATEGORY.TXT,
       (select sum(X_PRICE)
        from (select first 10 X_PRODUCT.PRICE X_PRICE
              from PRODUCT X_PRODUCT
              where X_PRODUCT.CATEGORY_ID = CATEGORY.ID
              order by PRICE desc))
from category

fazit: subselects sind wenn indiziert zugegriffen wird, auch schon sehr hilfreich, es ginge auch per execute block mit zwischenvariablen
aber ganz wichtig: das was ich da oft bei kunden sehe sind subselects auf prozeduren und damit nie indiziert, es sei denn die sp ist dafür
schon brauchbar definiert, das wird dann oft extrem performancekritisch. Oder ganz einfach: wenn so ein SQL dann bei euch sehr lang braucht
liegt das nicht an Firebird, sondern an eurer mieserablen Implementation, an der man aber immer was optimieren kann, ohne gleich alles
über den haufen zu werfen.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat