2016-07-17 3 views
0

Ich habe eine Auswahl, die zwei Tabellen verbindet, a und b, über eine Join-Tabelle, ab.Inkrementieren Zeilennummern für unzweideutige Zeilen in einer Verknüpfung auswählen

select a.*, b.* 
from a 
left join ab on a.id = ab.aid 
left join b on b.id = ab.bid; 

Und das erzeugt

id | athing | id | bthing 
----+----------+----+----------- 
    7 | athing x | 1 | bthing a 
    7 | athing x | 2 | bthing b 
    7 | athing x | 3 | bthing c 
    3 | athing y | 1 | bthing a 
(4 rows) 

Ich möchte eine Spalte, die schrittweise die Anzahl der Zeilen in a zählt. Das heißt:

count | id | athing | id | bthing 
-------+----+----------+----+----------- 
    1 | 7 | athing x | 1 | bthing a 
    1 | 7 | athing x | 2 | bthing b 
    1 | 7 | athing x | 3 | bthing c 
    2 | 3 | athing y | 1 | bthing a 
(4 rows) 

ich mit der Fensterfunktion row_number() ausgesehen haben, aber das scheint alle Zeilen zu zählen.

Ich möchte inkrementell die verschiedenen a Zeilen zählen, unabhängig davon, wie viele Zeilen die verbundene Tabelle erstellt.

Ist dies in Postgresql möglich? Vielen Dank.

Antwort

1

Verwenden row_number() wenn aus der Tabelle a (Anmerkung, die Reihenfolge der Zeilen in a ist definiert in over Klausel) Auswählen:

select a.*, b.* 
from (
    select row_number() over (order by id desc) as count, * 
    from a 
    ) a 
left join ab on a.id = ab.aid 
left join b on b.id = ab.bid; 

count | id | athing | id | bthing 
-------+----+----------+----+---------- 
    1 | 7 | athing x | 1 | bthing a 
    1 | 7 | athing x | 2 | bthing b 
    1 | 7 | athing x | 3 | bthing c 
    2 | 3 | athing y | 1 | bthing a 
(4 rows) 

oder dense_rank() auf dem Ergebnis-Datensatz.

select 
    dense_rank() over (order by a.id desc) as count, 
    a.*, b.* 
from a 
left join ab on a.id = ab.aid 
left join b on b.id = ab.bid; 

Lesen Sie über window functions.

Verwandte Themen