AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL group by jedoch nur 10 records pro Gruppe
Thema durchsuchen
Ansicht
Themen-Optionen

SQL group by jedoch nur 10 records pro Gruppe

Ein Thema von Kostas · begonnen am 6. Jan 2024 · letzter Beitrag vom 7. Jan 2024
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

SQL group by jedoch nur 10 records pro Gruppe

  Alt 6. Jan 2024, 19:41
Datenbank: Firebird • Version: 3.0 • Zugriff über: FireDac
Hallo Zusammen,

ein fiktives Beispiel und die Anforderung zu beschreiben:

In einer großer Firma gibt es mehrere Abteilungen. Jede Abteilungen hat mehrere Mitarbeiter.
Jetzt suche ich von jeder Abteilung die 10 Mitarbeiter mit dem höchsten Gehalt. Die 10 Gehälter werden zusammenaddiert zu einem ranging der Abteilung.

// so werden alle Gehälter aller Mitarbeiter der Gruppe zusammenaddiert. Ich benötige jedoch nur die 10 besten einer Abteilung
Code:
select Abteilung, sum(gehalt) as AbteilungGehalt
from firma
group by Abteilung
order by AbteilungGehalt desc
hat jemand eine Idee?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: SQL group by jedoch nur 10 records pro Gruppe

  Alt 6. Jan 2024, 20:05
Das ist ein klassischer Anwendungsfall für die Partition By Funktionen. Dabei filtert man je Abteilung die Ergebnisse mit RowNumber <= 10 aus.

Hier ist ein ähnliches Beispiel:

https://stackoverflow.com/questions/...-each-category

Firebird 3.0 Dokumentation dazu:

https://firebirdsql.org/file/documen...partition.html
Michael Justin
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: SQL group by jedoch nur 10 records pro Gruppe

  Alt 6. Jan 2024, 20:31
Hallo Michael,

oh, damit habe ich mich noch nicht beschäftigt. Ich erkenne in der FB Doku nicht wie ich die Anzahl an Mitarbeiter pro Abteilung begrenzen kann. Hast du mir einen Hinweis?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SQL group by jedoch nur 10 records pro Gruppe

  Alt 6. Jan 2024, 21:37
Hallo,
FB kann jetzt auch Rank, Rank Over
Im ersten Link ist dazu ein Bsp., zwar mit SQL-Server, aber ist ähnlich ...
Heiko

Geändert von hoika ( 6. Jan 2024 um 21:39 Uhr)
  Mit Zitat antworten Zitat
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
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: SQL group by jedoch nur 10 records pro Gruppe

  Alt 7. Jan 2024, 11:36
Hallo Holger,

vielen Dank für deinen Vorschlag.
Du hast es angesprochen. Manchmal komme die Daten eben nicht aus einer Tabelle die schön selectiert werden können, sondern von einer SPs. Auch in meinem Fall ist es so dass die einzelnen Mitarbeiter über eine SP die auch eine andere SP aufruft um alle Daten zu ermitteln. Ist ein komplexer Vorgang der nicht über Selects zu ermitteln ist.

Aus deinem Vorschlag würde der innere select mit first 10 die Daten von der SP holen. Das übergeordnete Select um die Abteilungssumme zu bilden ebenfalls aus der gleichen SP. Dummerweise benötige ich jetzt auch noch die 10 "teuersten" Mitarbeiter einer Abteilung aufgeführt. Also die komplette Konstruktion nochmals wobei diesmal die Abteilungssumme nicht benötigt wird sondern die Mitarbeiter.

Ich dachte, ich erzeug ein Execute Block oder eine neue SP. Die erste Aufgabe, die SP die die Daten liefert in einer GTT per CREATE GLOBAL TEMPORARY TABLE abzulegen. Dann kann ich deinen Vorschlag verwenden und indexiert mehrfach auf die GTT zugreifen. Da in einer SP die GTT nicht angelegt werden kann, habe ich gesehen dass IBExpert diese anlegen kann. Habe ich noch nie gebraucht. Mal sehen ob das ein Vorteil bringt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz