AW: [pgsql-de-allgemein] Gruppenweise Anzahl der Datensätze begrenzen

From: "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de>
To: "'Thomas Uzunoff'" <postgresql(at)grizzlycrm(dot)de>, <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: AW: [pgsql-de-allgemein] Gruppenweise Anzahl der Datensätze begrenzen
Date: 2013-12-18 15:15:04
Message-ID: 032201cefc03$ee096e60$ca1c4b20$@internet24.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

> -----Ursprüngliche Nachricht-----
> Von: pgsql-de-allgemein-owner(at)postgresql(dot)org [mailto:pgsql-de-allgemein-
> owner(at)postgresql(dot)org] Im Auftrag von Thomas Uzunoff
> Gesendet: Mittwoch, 18. Dezember 2013 16:10
> An: pgsql-de-allgemein(at)postgresql(dot)org
> 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 : kretschmer(at)internet24(dot)de
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

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Thomas Uzunoff 2013-12-18 16:35:42 Re: [pgsql-de-allgemein] AW: [pgsql-de-allgemein] Gruppenweise Anzahl der Datensätze begrenzen
Previous Message Thomas Uzunoff 2013-12-18 15:10:21 Gruppenweise Anzahl der Datensätze begrenzen