Re: [pgsql-de-allgemein] AW: [pgsql-de-al lgemein] Gruppenweise Anzahl der Datensätze be grenzen
Thomas Uzunoff <[email protected]> Wed, 18 Dec 2013 17:35:42 +0100
| Newsgroups | gmane.comp.db.postgresql.german |
|---|---|
| Message-ID | <[email protected]> |
Danke, hat funktioniert :) Am 18.12.2013 16:15, schrieb Andreas Kretschmer - internet24 GmbH: > > >> -----Ursprüngliche Nachricht----- >> Von: [email protected] [mailto:pgsql-de-allgemein- >> [email protected]] Im Auftrag von Thomas Uzunoff >> Gesendet: Mittwoch, 18. Dezember 2013 16:10 >> An: [email protected] >> Betreff: [pgsql-de-allgemein] Gruppenweise Anzahl der Datensätze >> begrenzen >> >> Hallo, >> >> ich habe eine Tabelle wie diese mit den Spalten id und x. Spalte id ist >> PK. >> >> id | x >> ----------- >> 1 | a >> 3 | a >> 4 | b >> 5 | a >> 6 | b >> 10 | c >> 11 | b >> 12 | c >> 13 | d >> >> Hiervon möchte ich die id's haben, aber nur maximal zwei (oder eine >> definierte andere Anzahl) pro Wert in Spalte x. Welche id's pro Spalte x >> Wert selektiert wird, soll zufällig sein (bei normalen Abfragen mit >> LIMIT gibt die Datenbank gewöhnlich das selbe Ergebnis zurück, das ist >> aber nicht gewollt) >> >> Beispiel für ein gültiges Ergebnis: >> >> id | x >> ----------- >> 1 | a >> 3 | a >> 4 | b >> 6 | b >> 10 | c >> 12 | c >> 13 | d >> >> aber auch das hier wäre gültig: >> >> id | x >> ----------- >> 3 | a >> 5 | a >> 6 | b >> 11 | b >> 10 | c >> 12 | c >> 13 | d >> >> Was ich bisher herausgefunden habe ist, dass ich mit random() und einem >> LIMIT die Sortierung und das LIMIT angeben kann. Hier habe ich aber das >> Problem, dass das LIMIT für die gesamte Abfrage gilt, und nicht für >> jeden einzelnen Wert der Spalte x. >> >> Alle id's, deren Spalte x Wert maximal 2 mal vorkommt kann ich auch >> einfach selektieren. Wenn es aber mehr als 2 (oder eine zu definierende >> Anzahl) und dadurch die Anzahl der Ergebnisse eingeschränkt werden >> müsste, komme nicht weiter. >> >> Für Lösungshinweise wäre ich dankbar. >> >> Grüße >> >> Thomas > > test=*# select x, id, row_number() over (partition by x order by random()) from thomas ; > x | id | row_number > ---+----+------------ > a | 3 | 1 > a | 5 | 2 > a | 1 | 3 > b | 4 | 1 > b | 6 | 2 > b | 11 | 3 > c | 10 | 1 > c | 12 | 2 > d | 13 | 1 > (9 rows) > > test=*# select x, id from (select x, id, row_number() over (partition by x order by random()) from thomas) foo where row_number <= 2 ; > x | id > ---+---- > a | 5 > a | 1 > b | 11 > b | 6 > c | 10 > c | 12 > d | 13 > (7 rows) > > > > Mit freundlichen Grüssen > > Andreas Kretschmer > - 2nd-Level Support - > -- GrizzlyCRM Thomas Uzunoff Inhaber Barbarossastr. 15 53721 Siegburg Telefon: 089 21551939 Mobil: 0163 8346340 E-Mail: [email protected] URL: www.grizzlycrm.de USt-IdNr.: DE276930532 Diese E-Mail kann rechtlich geschützte und/oder vertrauliche Informationen enthalten. Sollten Sie nicht der richtige Adressat sein oder irrtümlich diese E-Mail erhalten haben, vernichten Sie diese E-Mail und benachrichtigen Sie den Absender. Weitergabe und Kopie an Unbefugte ist untersagt. AGB: http://www.grizzlycrm.de/agb This e-mail may contain proprietary and / or confidential information. If you are not the intended recipient or have received this email by mistake, please delete this e-mail and notify the sender. Transfer and copy is prohibited to unauthorized. -- Sent via pgsql-de-allgemein mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-de-allgemein