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