Gruppierung

images/download/attachments/169607365/image-2024-2-6_16-40-44-version-1-modificationdate-1707234044806-api-v2.png

Sucharten mit Ausgabespalten (CSV Suche, Tupel-Suche) unterstützen optional die Definition einer Liste von Projektionen für Gruppierungskriterien.

Konfigurierte Gruppierungskriterien werden in der Regel direkt auf den GROUP BY-Abschnitt in erzeugten SELECT-Anweisungen abgebildet.

Die Gruppierung zielt darauf ab, die primäre Trefferliste einer Suche nachträglich so zusammenzufassen, dass im Endergebnis für jede eindeutige Kombination der als Gruppierungskriterien aufgelisteten Projektionen nur eine einzige Zeile ausgegeben wird. Dabei können Aggregationsfunktionen (s. Aggregation) verwendet werden, um die Daten der gruppierten Datensätze zusammenzufassen.

  • Die primäre Trefferliste berücksichtigt die ggf. als "Bedingung" definierten Einschränkungen sowie ggf. Joins, die auf die primäre Trefferliste sowohl einschränkend als auch multiplizierend wirken können.

  • Als Gruppierungskriterium definierte Projektionen müssen nicht als Ausgabespalten konfiguriert sein.

  • Umgekehrt gilt aber für die Definition von Projektionen für Ausgabespalten oder zur Sortierung die folgende strikte Regel:

    • Eine Projektion für eine Ausgabespalte oder ein Sortierkriterium muss als "Projektion" innerhalb einer Aggregationsfunktion (s. Aggregation) eingesetzt werden, wenn deren Konfiguration ein Feld einbezieht, das nicht auch per Feldprojektion als Gruppierungskriterium definiert ist.
      ANMERKUNG◄ Was diese Restriktion für die praktische Handhabung der Gruppierung bedeutet, sollen das letzte Beispiel (s. unten) illustrieren.


WICHTIG◄ Die Option "Gesamtanzahl berechnen" darf nicht ausgewählt sein, wenn unter Gruppierung mehr als ein Gruppierungskriterium konfiguriert ist.


Konfiguration

Das Datenmodell der relevanten Sucharten (CSV Suche, Tupel-Suche) bietet ein Listenfeld Gruppierung (groupBy) an, das als Listenwerte Projektionen erwartet:

  • Per Standard (s. Screenshot oben) ist die Liste Gruppierung leer.

  • Per Klick auf das images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/add.svg -Symbol kann der Liste ein Gruppierungskriterium (Projektionskonfiguration) hinzugefügt werden

  • Ein bestehendes Gruppierungskriterium kann per Klick auf das Mülltonne-Symbol entfernt werden.

  • Soweit der Kontext eine Baumstruktur für die Darstellung der Suche bereitstellt, kann die Reihenfolgeposition von Gruppierungskriterien per Drag & Drop angepasst werden.


images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg ACHTUNGimages/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg Die Reihenfolge der Gruppierungskriterien hat im Allgemeinen keinen Einfluss auf die Ergebnisse der Gruppierung und von ggf. vorhandenen Aggregationsfunktionen. Allerdings kann die Reihenfolge der Gruppierungsergebnisse von der Reihenfolge der Gruppierungskriterien abhängen und das kann in Verbindung mit einer Begrenzung der Ausgabezeilen über den Parameter "Maximale Ergebnisse" zu inhaltlichen Unterschieden im Ergebnis führen. Dies betrifft auch den Fall, dass für den Parameter "Maximale Ergebnisse" der Wert 0 ("unbegrenzt") gilt, denn dann greift die Standard-Obergrenze von 100 Zeilen, was bedeutet, dass das Ergebnis nicht mehr als 100 "Gruppen"-Zeilen ausgibt.


Beispiele

Einfacher Anwendungsfall: Einstufige Gruppierung

Eine CSV Suche für Adressen soll eine eindeutige Liste aller Ausprägungen für das Feld "Postleitzahl" (zipcode) liefert, die in Adressbucheinträgen vorgefunden werden, für die Lesezugriff besteht.

Konfiguration:

Die CSV Suche wird wie rechts abgebildet konfiguriert:

  • Die Liste der Projektionen enthält als einzige Ausgabespalte eine Feldprojektion für das Feld "Postleitzahl" (zipcode).

  • Die Liste Gruppierung verwendet als einziges Gruppierungskriterium eine Feldprojektion für dasselbe Feld "Postleitzahl" (zipcode).

Für alle weiteren Konfigurationsmerkmale wurden die für den Abfragekonfigurator anwendbaren Standardwerte beibehalten.


Laufzeitbeispiel:

zipcode
==============
""
EH42
1174
22045
94474
1972
94315
X64GB
""
12529
40210
...

HINWEIS◄ Der Wert "" steht hier für die Leere Zeichenfolge (""), die in einer CSV-Suche auch den $null-Wert repräsentiert. Nur deshalb kann die Liste diesen Wert hier doppelt enthalten. Eine Tupel-Suche würde die Unterschiedung von "" und $null transparent darstellen.

images/download/attachments/169607365/image-2024-2-7_10-47-30-version-1-modificationdate-1707299250839-api-v2.png

WICHTIG Die CSV Suche wird in der gegebenen Konfiguration maximal 100 Postleitzahlen auflisten, da diese Obergrenze greift, wenn der Standardwert 0 für den Parameter Maximale Ergebnisse angegeben ist. Die effektive Obergrenze gibt ein Rückgabewert vom Typ "Sucherergebnis" (CsvSearchResult bzw. TupleSearchResult) im maxResults-Feld an.

Typischer Anwendungsfall: Gruppierung mit Aggregation

Das vorherige Beispiel soll nun um eine Ausgabespalte erweitert werden, die angibt, in wie vielen Adressbucheinträgen jeder zipcode-Wert gefunden wurde.

Konfiguration:

Wie im Screenshot rechts gezeigt, wurde die zusätzliche Spalte vor der bestehenden Feldprojektion für das "Postleitzahlfeld" (zipcode) eingerichtet:

  • Es wird eine Aggregation-Projektion mit dem Typ "Anzahl" (COUNT) verwendet.

  • Als Projektion ist das Feld "ID" (id) ausgewählt. Zum Ermitteln einer "Anzahl" ist bzgl. der Feldauswahl nur ausschlaggebend, ob dieses gefüllt ist. Das ist für das id-Feld für alle Entitäten sicher gewährleistet.


images/download/attachments/169607365/image-2024-2-7_11-46-48-version-1-modificationdate-1707302808649-api-v2.png

Laufzeitbeispiel:

COUNT of id,zipcode
===================
11,
1,EH42
1,1174
2,22045
1,94474
2,3000
1,1972
2,94315
1,X64GB
5,
1,12529
2,40210
...

Die Beispieldaten (links) zeigen, die Ergebnisse der Aggregation.

Die erste Spalte mit der automatisch bereitsgestellten Standard-Beschriftung "COUNT of id" gibt an, wie viele Adressbucheinträge sich auf die jeweilige "Postleitzahl" (zipcode) beziehen.

Solange keine Sortierung definiert ist, ergibt sind die Reihenfolge der Ergebnisse aus der internen Logik der Datenbank beim Gruppieren.

Falls mehr unterschiedliche Postleitzahlen in Adressbucheinträgen gefunden werden, als die Suche aufgrund der Einstellung für den Parameter "Maximale Ergebnisse" zurückgeben soll, liefert die Abfrage unter diesenn Bedingungen eine mehr oder weniger zufällige Teilmenge.

Die nachfolgende Variante soll deshalb den Einsatz der Sortierung in Verbindung mit der Gruppierung demonstrieren.

Variante:

Die bestehende CSV Suche soll nun so angepasst werden, dass als Suchergebnis die "TOP 10" der häufigsten Postleitzahlen in Adressbucheinträgen ausgibt.

Die Sortierung soll (natürlich) absteigend nach der Häufigkeit und - nur bei Gleichstand - aufsteigend nach der Postleitzahl erfolgen.

Konfiguration:

Der Screenshot rechts zeigt die zweistufige Sortierung an, die der CSV Suche hinzugefügt werden muss:

  • Das erste Sortierkriterium legt fest, dass absteigend (Option Aufsteigend ist abbgewählt) nach der Aggregation sortiert werden soll, die exakt der ersten Ausgabespalte (s. oben) entspricht.

  • Das zweite Sortierkriterium definiert, dass Aufsteigend (Option ausgewählt) nach der Feldprojektion für das Feld "Postleitzahl" (zipcode) sortiert werden soll, wenn mehrere Gruppenzeilen denselben Wert für das erste Sortierkriterium liefern.

images/download/attachments/169607365/image-2024-2-7_14-24-48-version-1-modificationdate-1707312288904-api-v2.png

Dass nur die "TOP 10" aufgelistet wird, regel der Wert 10 für den Parameter Maximale Ergebnisse in Verbindung mit dem Standard-Offset-Wert 0 für Erstes Ergebnis.

images/download/attachments/169607365/image-2024-2-7_14-44-8-version-1-modificationdate-1707313448299-api-v2.png

Laufzeitbeispiel:

COUNT of id,zipcode
===================
11,
5,
2,22045
2,3000
2,40210
2,80337
2,94315
1,1174
1,12529
1,13465

Die Beispieldaten (links) zeigen die gewünschte "TOP 10".

ANMERKUNG◄ Die beiden "häufigsten" Kategorien sind hier von den Werten Leere Zeichenfolge und $null belegt, was nicht unbedingt dem Sinn der "TOP 10" Bewertung entsprechen muss.

Mit einer Bedingung wie der folgenden könnten beide "Störfälle" ausgeschlossen werden:

images/download/attachments/169607365/image-2024-2-7_15-21-50-version-1-modificationdate-1707315710809-api-v2.png

Laufzeitbeispiel:

COUNT of id,zipcode
===================
2,22045
2,3000
2,40210
2,80337
2,94315
1,1174
1,12529
1,13465
1,1972
1,52036

Die Beispieldaten (links) zeigen die gewünschte "TOP 10" inklusive der Bedingung (oben) für "Postleitzahl gefüllt".

Leere Zeichenfolge und $null belegen nicht mehr die Spitzenplätze der Rangliste und am Ende sind zwei Einzeltreffer aufgerückt, die vorher nicht Teil der "TOP 10" waren.

Komplexerer Anwendungsfall: Mehrstufige Gruppierung

In Anlehnung an die obige Aufgabenstellung soll nun noch sichergestellt werden, dass Adressbucheinträge mit übereinstimmender "Postleitzahl" (zipcode) aber unterschiedlichem "Land" (countryCode) unterschieden werden.

Bisher wurden diese nämlich ungerechtfertigter Weise durch die Gruppierung zusammengefasst.

Konfiguration:

Der bisherigen Konfiguration wird wie rechts abgebildet unter Gruppierung ein zusätzliches Gruppierungskriterium hinzugefügt:

  • Eine Feldprojektion legt das Feld "Land" (countryCode) zusätzliches Gruppierungskriterium fest.

images/download/attachments/169607365/image-2024-2-7_15-36-47-version-1-modificationdate-1707316607818-api-v2.png

Laufzeitbeispiel:

COUNT of id,zipcode
===================
2,22045
2,3000
2,80337
2,94315
1,1174
1,12529
1,13465
1,1972
1,40210 █
1,40210 █

In den Beispieldaten (links) weist die Markierung auf den Effekt des zusätzlichen Gruppierungskriteriums hin:

  • Im Unterschied zum vorherigen Beispiel erscheint die "Postleitzahl" 40210 nun in den letzten beiden Zeilen mit einer Häufigkeit von 1 und nicht mehr auf Listenplatz 3 mit einer Häufigkeit von 2 (s. Liste oben).

  • Die "Postleitzahl" 52036 wurde vom letzten Listenplatz ins "Aus" verdrängt.

HINWEIS◄ Die zusätzliche Gruppierung nach dem "Land" (countryCode) wirkt also auch ohne Berücksichtigung in einer Ausgabespalte.

Laufzeitbeispiel:

COUNT of id,zipcode,countryCode
===============================
2,22045,DE
2,3000,BE
2,80337,DE
2,94315,DE
1,1174,CH
1,12529,DE
1,13465,DE
1,1972,KH
1,40210,DE █
1,40210,FR █

Die zusätzliche Ausgabespalte (countryCode DE/FR) verdeutlicht, warum die "Postleitzahl" (40210) nun zwei Listenplätze belegt.

Das zusätzliche Gruppierungskriterium soll allerdings auch transparent nachvollziehbar wirken. Also fügen wir die Feldprojektion für das "Land" (countryCode) auch unter den Projektionen als Ausgabespalte hinzu.

images/download/attachments/169607365/image-2024-2-7_15-54-16-version-1-modificationdate-1707317656959-api-v2.png

Komplexerer Anwendungsfall: Mehrstufige Gruppierung mit "Datenaufbereitung"

Die CSV Suche aus dem vorherigen Beispiel soll nun so umgestaltet werden, dass in den Projektionen für Gruppierung, Sortierung und Ausgabespalte nur noch das erste Zeichen der "Postleitzahl" (zipcode) berücksichtigt wird.

Sinngemäß soll eine "TOP 10" der Postleitzahlengebiete in den Adressbucheinträgen ermittelt werden.

Konfiguration:

Der Screenshot rechts zeigt den Abschnitt Gruppierung, wo das erste Gruppierungskriterium angepasst wurde:

  • Die Feldprojektion für das Feld "Postleitzahl" (zipcode) wurde ausgeschnitten und in einer neu erstellten Teilstring Projektion im Parameter Projektion eingefügt.

  • Das erste Zeichen der "Postleitzahl" wird per Startindex (1=Standard) und Max. Länge 1 "ausgeschnitten".

images/download/attachments/169607365/image-2024-2-7_17-28-38-version-1-modificationdate-1707323318976-api-v2.png

Der Screenshot rechts zeigt, wie die Teilstring Projektion für den "Ausschnitt" aus der "Postleitzahl" als Projektion für eine Ausgabespalte umgesetzt werden kann:

  • Die Teilstring Projektion muss als Projektion im Kontext einer Aggregationsfunktion eingesetzt werden, da die zugrundeliegende Feldprojektion für das zipcode-Feld nach der obigen Anpassung nicht mehr in der Liste der Gruppierungskriterien gefunden wird.

    ANMERKUNG◄ Dass das erste Gruppierungskriterium komplett identisch mit der Teilstring Projektion ist, wird dabei nicht (an-)erkannt.

  • Anstelle von Typ "Min" könnte auf "Max" für die Aggregation verwendet werden. Effektiv ist aufgrund der Gruppierung in jeder Gruppenzeile immer nur ein einheitlicher Wert aus der Teilstring Projektion zu erwarten.

images/download/attachments/169607365/image-2024-2-7_17-35-16-version-1-modificationdate-1707323716184-api-v2.png

Der Screenshot (rechts) zeigt die erforderliche Anpassung für die Sortierung:

  • Das erste Sortierkriterium kann unverändert beibehalten werden, denn, an der "Zählung" der "ID"-Werte ändert sich durch den Wechsel von der "Postleitzahl" zum "Postleitzahlengebiet" nichts.

  • Als zweites Sortierkriterium muss allerdings anstelle der ursprünglichen Feldprojektion für das zipcode-Feld die Teilstring Projektion aus der Gruppierung als Projektion innerhalb einer Aggregation mit Typ "Min" oder "Max" eingesetzt werden.

    ANMERKUNG◄ Auch hier gibt es wie im Kontext der Ausgabespalte eigentlich nichts zu aggregieren, sodass die Aggregationsfunktion nur benötigt wird, um formale Anforderungen (s. Einleitung) zu erfüllen.

images/download/attachments/169607365/image-2024-2-7_17-49-17-version-1-modificationdate-1707324557124-api-v2.png

Laufzeitbeispiel:

COUNT of id,MIN of substring of zipcode,countryCode
===================================================
4,8,DE
2,1,DE
2,3,BE
2,9,DE
1,1,CH
1,1,KH
1,2,DE
1,4,DE
1,4,FR
1,5,US

ANMERKUNG◄ Anstelle der automatisch erzeugten Spaltentitel wären sinnvollere Zuordnungen für das Name-Feld der Ausgabespalten zu empfehlen.