AW: [pgsql-de-allgemein] Gruppen weise Anzahl der Datensätze begr enzen
"Andreas Kretschmer - internet24 GmbH" <[email protected]> Wed, 18 Dec 2013 16:15:04 +0100
| Newsgroups | gmane.comp.db.postgresql.german |
|---|---|
| Message-ID | <[email protected]> |
> -----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 - -- HINWEIS: Der internet24-Support arbeitet im Team - bitte senden Sie daher immer die komplette Mailkommunikation mit. ------------------------------------------------- internet24 GmbH Bayrische Str. 18 D-01069 Dresden Fon : +49 (0)3 51 / 2 11 20 30 Fax : +49 (0)3 51 / 2 11 20 20 E-Mail : [email protected] Facebook: internet24gmbh URL : www.internet24.de Blog : blog.internet24.de Geschäftsführer: Heiko Heerwagen, Jan-Jaap Jager Registergericht: Amtsgericht Dresden HRB 12 899 Nutzen Sie ab sofort unsere Mobility- und Groupware-Lösungen auf Basis von Open-Xchange: http://www.internet24.de/webhosting/premiumwebmail.html Zertifiziert nach dem Sicherheitsstandard ISO 27001:2005
smime.p7s
(application/pkcs7-signature, 6.2 KB) - not displayed